【发布时间】:2012-07-02 19:45:51
【问题描述】:
我想在 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 );
输出是:
【问题讨论】:
-
那么问题是什么?您的 MSDN 链接描述了该功能。
-
@CJohnson,他对函数的使用有什么问题?来自文档:“如果发现内存泄漏,_CrtDumpMemoryLeaks 将返回 TRUE”。如果它不应该在
if中使用,则将返回void。 -
它只显示当前在堆上分配的所有东西,所以它们很可能不是真正的泄漏。也许有一些由 RTL 分配的静态初始化的堆对象。最好使用 _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF) 转储程序退出时尚未释放的任何已分配块。
-
@RomanR - 他的问题是“为什么显示的代码会报告内存泄漏?”。没有什么会导致泄漏....
-
我在 Visual Studio 2010(安装了所有补丁)上测试了您的最小程序(添加必要的标头并使用命名空间 std),当然它不会报告内存泄漏。您确定该程序确实显示了您系统上的泄漏吗?或者您是否删除了导致内存泄漏的全局变量?
标签: c++ memory-leaks visual-studio-2012