字符串导致内存泄漏?

zi3*_*guw 4 c++ memory-leaks

Visual C++在我的代码中发现内存泄漏,所以我把它缩小到尽可能最简单的测试用例并得到了这个:

#define _CRTDBG_MAP_ALLOC   // required
#include <stdlib.h>         // to enable MSVC++
#include <crtdbg.h>         // memory leak detection

#include <string>

using namespace std;

int main() {

    string foo;

    _CrtDumpMemoryLeaks();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Detected memory leaks!
Dumping objects ->
{130} normal block at 0x008748A8, 8 bytes long.
 Data:  B4 F9 44 00 00 00 00 00 
Object dump complete.

如果我评论出"string foo"; 它没有检测到任何东西.

我应该以某种方式取消分配foo吗?

sha*_*oth 12

你运行_CrtDumpMemoryLeaks()得太早,它报告string身体是泄漏.只有在所有本地对象都被销毁后才能运行它.

将所有有意义的工作包装在一个单独的函数中

void  doStuff()
{
    string variable;
}
Run Code Online (Sandbox Code Playgroud)

或添加嵌套范围:

int main()
{
    {
       string variable;
    }
    _CrtDumpMemoryLeaks();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @Oli:不可能怎么样?sharptooth演示了如何做到这一点. (2认同)

Shi*_*nok 10

程序/块终止后应该调用_CrtDumpMemoryLeaks.最好的方法是在程序终止时调用CRT,如_CrtDumpMemoryLeaks msdn文章中所述:

在程序执行结束时经常调用_CrtDumpMemoryLeaks以验证应用程序分配的所有内存是否已被释放.通过使用_CrtSetDbgFlag函数打开_crtDbgFlag标志的_CRTDBG_LEAK_CHECK_DF位字段,可以在程序终止时自动调用该函数.

通过以你的方式调用它,它将检测foo为泄漏,因为它的析构函数尚未被调用,因为执行块尚未结束.

  • 只是为了澄清@Shinnok的答案:不要直接调用`_CrtDumpMemoryLeaks()`,而是通过将以下行添加到程序中来自动调用它:`_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);` (2认同)