为什么在这里_CrtDumpMemoryLeaks会报告内存泄漏?

5
我希望在DEBUG模式下检查内存泄漏。我使用Windows,在此工作中,使用函数_CrtDumpMemoryLeaks
现在,为什么这段代码会发现内存泄漏呢?
#include <Windows.h>
#include <iostream>

int main()
{
    if(_CrtDumpMemoryLeaks() == TRUE)
        std::cerr << "MEMORY LEAK!" << std::endl;

    return 0;
}

编辑:

我添加了此代码以将输出直接定向到控制台:

_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );

输出结果为:

enter image description here


1
那么问题是什么?您的MSDN链接描述了该函数。 - Roman R.
2
@CJohnson,他使用这个函数有什么问题吗?从文档中可以看到:“_CrtDumpMemoryLeaks返回TRUE表示发现了内存泄漏”。如果它不应该在“if”语句中使用,那么它会返回“void”。 - Eran
2
它只显示当前在堆上分配的所有内容,因此它们可能不是真正的泄漏。也许一些静态初始化的堆对象是由RTL分配的。最好使用_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF)来转储任何未在程序退出时被释放的已分配块。 - Pete
2
@RomanR - 他的问题是“为什么这段代码会报告内存泄漏?”。 没有任何东西应该引起泄漏.... - Roddy
2
我在Visual Studio 2010上测试了你的最小程序(添加必要的头文件并使用命名空间std),当然它没有报告内存泄漏。你确定这个程序在你的系统上显示了泄漏吗?或者你剥离了导致内存泄漏的全局变量? - Werner Henze
显示剩余10条评论
1个回答

0

你是否包含了<crtdbg.h>

你确定你正在以调试模式运行吗?

在非调试模式下,对_CrtDumpMemoryLeaks()的调用会被预处理器移除,只留下if(TRUE)

编辑: 此外,为了检测内存泄漏,您需要添加以下代码行来使用malloc和free的调试版本-请参见这里。您能尝试添加这些吗?

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

你能否在代码中添加以下内容并查看是否打印输出? #ifdef _DEBUG std::cerr << "DEBUG MODE!" << endl; #endif 另外,我已经编辑了我的答案,请将那些行添加到你的代码中并查看输出。 - kjp
@Nick,好的,请看一下修改。包含文件必须按照指定的顺序 - 否则它将无法像MSDN页面所说的那样工作。 - kjp
我看了你的修改,但没有任何改变。结果始终如一:检测到内存泄漏(8字节),如果我添加例如int* i = new int;并且我不删除i,则CrtDumpMemoryLeaks函数还会显示新内存泄漏的4个字节。因此,你的回答不是正确的答案! - Nick
1
如果您找到了解决方案,能否在这里发布一下? - Pritesh Acharya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接