_bstr_t内存泄漏

时间:2012-10-22 12:09:45

标签: c++ memory-management memory-leaks bstr

我有一个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行)内存没有释放之后。我在这里做错了什么?

4 个答案:

答案 0 :(得分:8)

第一:

// 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不会立即向操作系统释放内存,它会缓存最近使用的字符串,以使SysAllocString更快。您不应期望在SysFreeString之后看到内存使用率直接下降。

您可以控制此行为以进行调试:

最后,在任务管理器中查看内存使用情况时,您需要查看“提交大小”列而不是“工作集”。转到菜单 - &gt;查看 - &gt;选择列以显示列。并且还要注意,这实际上只会在一段时间内有所帮助 - 内存可能不会立即释放到操作系统中,但如果您没有泄漏,则不会在一段时间内永远上升。

答案 1 :(得分:1)

我想你应该使用:

xml.Attach(GetXML(i));

operator =看起来它实际上正在分配新值 - 这意味着要复制它。 GetXML返回的值保持不一致。

也不需要SysFreeString(xml);

答案 2 :(得分:0)

任务管理器仅提供分配给进程的内存量。当C ++释放内存(C是免费的)时,它不一定会将内存返回给操作系统,因此任务管理器不一定会显示内存进入doem,直到进程结束。

任务管理器可以显示的是,如果继续分配内存而不释放内存,那么进程的内存大小将不断增加,如果发生这种情况,可能会导致内存泄漏。

编程时,您需要使用内存分析器来查看是否正在释放内存。在Windows中,我使用Rational的Purify为我提供了这些信息,但它花了很多钱。 MS C运行时可用于跟踪内存。 MSDN在此提供概述,阅读并按照链接进行操作。

关于你的代码以及根据其他评论和答案,使用_bstr_t类的一个要点是为你做内存和其他资源管理,所以你不应该调用SysFreeString

答案 3 :(得分:0)

_bstr_t的析构函数将调用SysFreeString(xml),因此您无需再次调用SysFreeString(xml)。额外的可用内存将导致崩溃。