_BSTR_T内存泄漏

_bstr_t memory leak

本文关键字:泄漏 内存 BSTR      更新时间:2023-10-16

我有一个C 代码。但这无法正确释放记忆。告诉我我错了,这是我的代码

1 void MyClass::MyFunction(void)
2 {
3    for (int i=0; i<count; i++)
4    {
5        _bstr_t xml = GetXML(i);
6        // some work
7        SysFreeString(xml);
8    }
9 }

getxml(第5行)返回我的BSTR。在这种记忆中,程序增加了。但是在Sysfreestring(第7行)后,内存不会释放。我在这里做错了什么?

首先:

// This makes a copy.
// This is where the leak is. You are leaking the original string.
_bstr_t xml = GetXML();
// You want to use this, to attach the BSTR to the _bstr_t
_bstr_t xml = _bstr_t(GetXML(), false);

第二,不要这样做

SysFreeString(xml); 

_bstr_t类将为您做。

第三,BSTR不会立即将内存释放到OS,它最近使用字符串来使Sysallocstring更快。您不应该期望看到记忆使用量在sysfreestring后直接下降。

您可以为调试目的控制此行为:

  • http://support.microsoft.com/default.aspx?scid=kb; en-us;q139071

最后,在任务管理器中查看内存使用时,您需要查看"提交大小"列"不工作集"列。转到菜单 ->查看 ->选择列显示列。还要注意,这实际上只有一段时间的帮助 - 可能不会立即将内存发布到操作系统,但是如果您没有泄漏,则不会在几个小时内永远上升。

我想您应该使用:

xml.Attach(GetXML(i));

操作员=看起来它实际上是在分配新值 - 这意味着复制它。getxml返回的值保持未固定。

也不需要Sysfreestring(XML);

任务管理器仅提供分配给该过程的内存量。当C 释放内存(免费)时,它不一定会将内存返回操作系统,因此任务管理器不一定会在过程结束之前显示内存。

任务管理器可以显示的是,如果您继续分配内存而不是发布记忆,那么该过程的内存大小将继续增加,如果发生这种情况,您可能会泄漏内存。

编程时,您需要使用内存介绍者来查看是否要释放内存。在Windows中,我使用Rational的净化为我提供了此信息,但要花很多钱。MS C运行时可用于跟踪内存。MSDN在此处提供了一个概述,阅读并遵循TH链接。

关于您的代码以及其他评论,并回答使用_bstr_t类的点之一是为您进行内存和其他资源管理,因此您不应致电Sysfreestring

_BSTR_T的驱动器将调用sysfreestring(XML),因此您无需再次致电Sysfreestring(XML)。额外的免费内存将导致崩溃。