我正在尝试在 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/