4

我有一个 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

4 回答 4

8

First:

// 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);

Second, don't do this:

SysFreeString(xml); 

The _bstr_t class will do that for you.

Third, BSTR will not release the memory to the OS immediately, it caches recently used strings in order to make SysAllocString faster. You shouldn't expect to see memory usage go straight down after SysFreeString.

You can control this behaviour for debugging purposes:

Lastly, when viewing memory usage in Task Manager you need to look at the column "Commit Size" not "Working Set". Go to Menu->View->Select Columns to show the column. And also note that this really only helps over a period of time - the memory may not be released to the OS immediately, but if you have no leaks, it shouln't go up forever, over a course of hours.

于 2012-10-22T12:29:36.873 回答
1

我想你应该使用:

xml.Attach(GetXML(i));

operator= 看起来它实际上是在分配新值 - 这意味着复制它。GetXML 返回的值保持未释放状态。

也应该不需要 SysFreeString(xml);

于 2012-10-22T12:16:53.557 回答
0

Task Manager only provides the amount of memory allocated to the process. When C++ releases memory ( C's free) it does not necessarily return the memory to the Operating system so Task Manager will not necessarily show memory going doem until the process ends.

What Task Manager can show is if you keep allocating memory and not releasing it then the memory size of the process will keep increasing, if this happens you probably hava a memory leak.

When programming you need to use memory profilers to see if you are releasing memory. In Windows I used Rational's Purify to give me this information but it costs a lot. MS C runtime can be used to track memory. MSDN provides an overview here, read and follow th links.

As to your code and as per other comments and answers one of the points of using _bstr_t class is to do the memory and other resource management for you so you should not call SysFreeString

于 2012-10-22T12:29:39.460 回答
0

_bstr_t 的析构函数会调用 SysFreeString(xml),所以不需要再调用 SysFreeString(xml)。额外的可用内存将导致崩溃。

于 2019-12-03T01:05:55.230 回答