我已经读过以下代码导致内存泄漏.但不明白为什么.
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 – 内存泄漏.
原文地址:https://www.jb51.cc/html/226591.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。