如果我在一个线程上调用一个返回BSTR
的COM方法,那么从另一个线程调用SysFreeString()
上的BSTR
是否安全? COM调用完成后,我将不再使用第一个线程上的BSTR
,因此不应存在任何并发问题。但是考虑到COM与线程的关系,我不确定SysFreeString()
是否依赖于在同一线程上分配的BSTR
。
示例代码:
BSTR value = nullptr;
HRESULT hr = pComObject->DoSomething(&value);
if(FAILED(hr))
{
return hr;
}
std::thread t([value] {
// do something with value
SysFreeString(value);
});
t.detach();
答案 0 :(得分:3)
MSDN没有明确说明,但仍有Sys*String
函数正在使用IMalloc
,CoGetMalloc
和朋友的操作系统实现的引用。
自动化可以缓存为BSTR分配的空间。这加速了SysAllocString / SysFreeString序列。但是,这也可能导致IMallocSpy将错误分配给错误的内存用户,因为它不知道Automation完成的缓存。
COM实施is thread safe:
通常,您不应该使用COM实现来实现IMalloc,而是使用COM实现,它确保在管理任务内存时是线程安全的。通过调用CoGetMalloc函数,您可以获得指向COM任务分配器对象的IMalloc的指针。
总之,可以从另一个帖子中释放字符串。