在不同的线程上解除分配BSTR是否安全?

时间:2015-07-10 12:51:21

标签: c++ windows multithreading com

如果我在一个线程上调用一个返回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();

1 个答案:

答案 0 :(得分:3)

MSDN没有明确说明,但仍有Sys*String函数正在使用IMallocCoGetMalloc和朋友的操作系统实现的引用。

  

自动化可以缓存为BSTR分配的空间。这加速了SysAllocString / SysFreeString序列。但是,这也可能导致IMallocSpy将错误分配给错误的内存用户,因为它不知道Automation完成的缓存。

COM实施is thread safe

  

通常,您不应该使用COM实现来实现IMalloc,而是使用COM实现,它确保在管理任务内存时是线程安全的。通过调用CoGetMalloc函数,您可以获得指向COM任务分配器对象的IMalloc的指针。

总之,可以从另一个帖子中释放字符串。