【问题标题】:Why is _CrtDumpMemoryLeaks reporting a memory leak here?为什么_CrtDumpMemoryLeaks 在这里报告内存泄漏?
【发布时间】: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


【解决方案1】:

您是否添加了 &lt;crtdbg.h&gt;

您确定您在调试模式下运行吗?

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

编辑: 此外,要检测内存泄漏,您需要添加以下行以使用 malloc 和 free 的调试版本 - 请参阅 here。您可以尝试添加这些吗?

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

【讨论】:

  • 您可以在代码中添加#ifdef _DEBUG std::cerr &lt;&lt; "DEBUG MODE!" &lt;&lt; endl; #endif 并查看是否打印吗?我还编辑了我的答案 - 请将这些行添加到您的代码中并查看输出。
  • @Nick 好的,请参阅编辑。并且包含必须按照指定的顺序 - 否则它不会像 MSDN 页面所说的那样工作。
  • 我阅读了您的编辑,但它并没有改变任何东西。结果总是一样的:检测到内存泄漏(8 个字节),如果我添加例如 int* i = new int; 并且我不删除 i CrtDumpMemoryLeaks 函数也会显示新内存泄漏的 4 个字节.所以你的答案不是正确答案!
  • 如果您找到了解决方案,可以在这里发布吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多