CComBSTR的内存泄漏

我已经读过以下代码导致内存泄漏.但不明白为什么.
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);

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

解决方法

它泄漏是因为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 – 内存泄漏.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些