CComBSTR的内存泄漏

时间:2009-11-16 23:12:01

标签: com memory-leaks com-interop atl bstr

我已经读过以下代码导致内存泄漏。但不明白为什么。

CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);

当我们没有分配任何东西时,它是如何导致泄漏的?

2 个答案:

答案 0 :(得分:11)

它泄漏是因为get_Bar()get_Baf()不知道您使用的是CComBSTR。

当您获取CComBSTR的地址时,您实际传递给底层对象的是指向CComBSTR的BSTR成员的指针。

分解序列:

CComBSTR str;

这会将内部BSTR初始化为NULL。

pFoo->get_Bar(&str);

get_Bar()看到BSTR *并用实际数据填充它。像这样:

HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }

现在str的内部BSTR是真正的BSTR。当CComBSTR超出范围时,它将删除str成员。

现在,如果您在& str上调用get_Baf(),则问题是CComBSTR不知道您正在更改字符串。所以你这样打电话给get_Baf()

HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }

现在get_Baf()覆盖了str内部BSTR的原始值,而没有任何人释放get_Bar()分配的数据。

Ta da - 内存泄漏。

答案 1 :(得分:4)

此Microsoft页面可能是您阅读它的地方:

http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx

  

内存泄漏问题

     

将初始化的CComBSTR的地址作为[out]参数传递给函数会导致内存泄漏。

CComBSTR对象在内部分配内存。显然有些情况下它不会释放它。