c++ - IEnumString::Next 的资源管理契约是什么?

标签 c++ winapi com

我正在尝试在 IEnumString 上实现一个迭代器界面。我很难弄清楚 IEnumString::Next() 的精确契约(Contract)方法。

第二个参数说明如下:

rgelt

An array of enumerated items.

The enumerator is responsible for allocating any memory, and the caller is responsible for freeing it.

让我困惑的部分是如何正确管理内存。显然,IEnumString 实现分配了请求调用者释放的内存。这似乎暗示 OLESTR* 的接收指向内存,其所有权已转移给调用者。

这是文档的解释方式吗?如果是这样,应该使用哪个分配器来释放内存?

最佳答案

根据 this Microsoft-authored sample on Github ,应通过调用 CoTaskMemFree 释放内存。

从第 91 行开始阅读:

IFACEMETHODIMP CSampleSpellCheckProvider::InitializeWordlist(WORDLIST_TYPE wordlistType, _In_ IEnumString* words)
{
    unsigned int type = wordlistType;
    engine.ClearWordlist(type);

    HRESULT hr = S_OK;
    while (S_OK == hr)
    {
        LPOLESTR lpWord;
        hr = words->Next(1, &lpWord, nullptr);

        if (S_OK == hr)
        {
            hr = engine.AddWordToWordlist(type, lpWord);
            CoTaskMemFree(lpWord);
        }
    }

    return hr;
}

关于c++ - IEnumString::Next 的资源管理契约是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67999012/

相关文章:

c++ - 使用 std::optional 通过引用将 std::vector<int> 传递给函数

c++ - 调用 VirtualProtect 设置了错误的保护

.net - 从具有不同 GUID 的 .Net 引用 COM+

c# - 如何使用 C# 接口(interface)将 C++ 智能指针返回到 PowerPoint 接口(interface)

c++ - 无需注册 DLL 即可解决 C4772 错误的任何方法?

c++ - 位掩码和长长

c++ - 使用 `std::reference_wrapper<T>` 作为始终有效的成员变量而不是指针有什么缺点吗?

c++ - 设置 DXGI_SWAP_CHAIN_DESC1 的 AlphaMode 成员会使 CreateSwapChainForHwnd 失败并返回 0x887a0001

windows - 使用 Windows 8 SDK 为 Windows 7 编译

delphi - 将adoconnection从vba传递到delphi