CComBSTR 内存泄漏
我读到以下代码会导致内存泄漏。但不明白为什么。
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
当我们没有分配任何东西时,它是如何导致泄漏的?
I have read that the following code causes memory leak. But did not understand why.
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
How does it cause a leak when we are not allocating anything?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
它会泄漏,因为
get_Bar()
和get_Baf()
不知道您正在使用 CComBSTR。当您获取 CComBSTR 的地址时,实际上传递给底层对象的是指向 CComBSTR 的 BSTR 成员的指针。
分解序列:
这会将内部 BSTR 初始化为 NULL。
get_Bar()
看到 BSTR* 并用实际数据填充它。像这样:现在
str
的内部BSTR是一个真正的BSTR。当 CComBSTR 超出范围时,它将删除str
成员。现在,如果您对 &str 调用
get_Baf()
,问题是 CComBSTR 不知道您正在更改字符串。所以你像这样调用get_Baf()
:现在
get_Baf()
已经覆盖了str
内部 BSTR 的原始值,而没有任何人释放数据由get_Bar()
分配。Ta da - 内存泄漏。
It leaks because
get_Bar()
andget_Baf()
don't know that you're using a CComBSTR.When you take the address of a CComBSTR what you're actually passing to the underlying object is a pointer to the CComBSTR's BSTR member.
Breaking down the sequence:
This initializes the internal BSTR to NULL.
get_Bar()
sees a BSTR* and fills it with actual data. Like this:Now the internal BSTR of
str
is a real BSTR. When CComBSTR goes out of scope it will delete thestr
member.Now if you call
get_Baf()
on &str the problem is that the CComBSTR doesn't know that you are changing the string. So you callget_Baf()
like this:Now
get_Baf()
has overwritten the original value ofstr
's internal BSTR without anyone freeing the data that was allocated byget_Bar()
.Ta da - Memory leak.
您可能在这个 Microsoft 页面上阅读到它:
http://msdn。 microsoft.com/en-us/library/bdyd6xz6.aspx
CComBSTR 对象正在内部分配内存。显然存在不释放它的情况。
This Microsoft page is probably the where you read about it:
http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx
The CComBSTR object is allocating memory internally. Evidently there are cases where it doesn't release it.