7

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

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

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

4

2 回答 2

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"); }

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

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

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

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

Ta da - 内存泄漏。

于 2009-11-16T23:53:06.497 回答
4

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

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

内存泄漏问题

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

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

于 2009-11-16T23:28:44.890 回答