我在VS 2008中做一个c++项目已经有一段时间了。直到最近,在终止我的应用程序时,输出窗口将显示我是否有任何内存泄漏。然而,几天前我注意到它停止显示这些有价值的信息。我还试着抛出一些printf(),但输出窗口也没有显示。
我猜我改变了一个偏好,但我似乎找不到它。现在所有的输出显示的是它加载/卸载了哪个dll。什么好主意吗?
谢谢,迈克
根据我自己的经验,内存泄漏输出丢失可能是由于不同的原因。总结一下最重要的:
-
源代码的变化:
- 禁用内存泄漏报告(即使用_CrtSetDbgFlag)
- 安装自定义报告挂钩(见_CrtSetReportHook, _CrtSetReportHook2)
- 将输出重定向到一个文件(参见CrtSetReportMode )
- 源代码中导致应用程序终止时无声"崩溃"的更改——在到达报告内存泄漏的点之前,应用程序在没有任何问题指示的情况下无声地终止(似乎不太可能发生这种情况)。
-
开发环境中的设置导致输出被重定向到另一个窗口。一种可能性是:Tools Options Debugging General 将所有输出窗口文本重定向到立即窗口(从底部开始的第五个)。
#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;
}
如果正确运行此应用程序输出内存泄漏,那么不幸的是,您可能处于情况1
当然,我排除了输出可能消失的明显原因(其中一些已经在评论中提到)。