1

我在 VS 2008 中从事 C++ 项目已经有一段时间了。直到最近,在终止我的应用程序时,输出窗口会显示我是否有任何内存泄漏。然而,几天前我注意到它停止显示这些有价值的信息。我也尝试抛出一些 printf(),但输出窗口也没有显示。

我猜我在某处改变了偏好,但我似乎找不到它。现在所有输出显示的是它已加载/卸载的 dll。有任何想法吗?

谢谢,迈克

4

1 回答 1

0

根据我自己的经验,丢失的内存泄漏输出可能是由于不同的原因。总结最重要的:

  1. 源代码中的更改:

    • 禁用内存泄漏报告(即使用_CrtSetDbgFlag
    • 安装自定义报告挂钩(请参阅 _CrtSetReportHook、_CrtSetReportHook2
    • 将输出重定向到文件(请参阅CrtSetReportMode
    • 导致应用程序终止时静默“崩溃”的源代码更改 - 在达到报告内存泄漏的点之前,应用程序静默终止而没有任何问题的迹象(这似乎不太可能,我曾经有过这种情况)。
  2. 开发环境中的设置会导致输出重定向到另一个窗口。一种可能性是:工具\选项\调试\常规\将所有输出窗口文本重定向到即时窗口(倒数第五个)。这里可能还存在其他可能性。

我想排除第 2 点的一种可能性是在 (main.cpp) 的行中创建一个简单的控制台应用程序:

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

#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    _CrtSetDbgFlag(nOldState | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    int *pInt = new int[100];
    return 0;
}

如果正确运行此应用程序会输出内存泄漏,那么不幸的是,您可能是第一种情况

当然,我排除了输出可能消失的明显原因(其中一些已经在评论中提到)。

于 2011-09-20T09:11:29.050 回答