CComBSTR的内存泄漏

Jul*_*ian 7 com memory-leaks atl bstr com-interop

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

CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*ron 11

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

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

打破顺序:

CComBSTR str;
Run Code Online (Sandbox Code Playgroud)

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

pFoo->get_Bar(&str);
Run Code Online (Sandbox Code Playgroud)

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

HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }
Run Code Online (Sandbox Code Playgroud)

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

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

HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }
Run Code Online (Sandbox Code Playgroud)

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

Ta da - 内存泄漏.