我正试图在IEnumString
接口上实现一个迭代器。我很难弄清楚IEnumString::Next()
方法的精确契约。
第二个参数记录如下:
rgelt
枚举项的数组。
枚举器负责分配任何内存,调用程序负责释放内存
让我困惑的是如何正确管理内存。显然,IEnumString
实现分配了调用方被请求释放的内存。这似乎意味着OLESTR*
的接收指向其所有权已转移到调用方的内存。
这就是解释文件的方式吗?如果是,应该使用哪个分配器来释放内存?
根据微软在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;
}