原谅我可怜的英语。
我想检查内存泄漏:
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
当程序退出时,我在vs2012的调试输出面板中看不到任何输出。
然后我进入_CrtDumpMemoryLeaks()并发现内存泄漏,泄漏检查结果正确,但无法打印出来。
所以我试过了:
OutputDebugStringA("Output string");
VS仍然没有打印任何内容。
我试过 DebugView ,一切运行正常,但很麻烦。
AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
这也可以很好用。
答案 0 :(得分:2)
你以某种方式让VS调试器进入了一个不显示调试输出的模式,这是由OutputDebugString()生成的。将输出重定向到立即窗口已被覆盖,因此不可能。
实际上只剩下一名候选人了。右键单击“输出”窗口,确保勾选“程序输出”选项。这一个:
答案 1 :(得分:0)
Microsoft Connect提供的解决方案:
如果在
下选中Visual Studio选项“将所有输出窗口文本重定向到立即窗口”,则调试可能不会在输出窗口中显示调试.WriteLine调用菜单工具>选项>调试>一般。要显示“工具>选项>调试”,请选中“工具>选项>显示所有设置”旁边的框。
答案 2 :(得分:0)
一个简短的例子:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
/*Your includes*/
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
#define SIZE 5
int main()
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
int* myArrayCAlloc = (int*)malloc(sizeof(int) * SIZE);
int* myArrayCppAlloc = new int[SIZE];
return 0;
}
我认为它运作正常。
此映射仅在调试版本中发生。
和
但是,如果您的程序使用C ++ new运算符分配内存,则需要重新定义新内存。
通过以下内容:
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
如果您注释掉示例中的分配,则不会在“输出”窗口的“调试”窗格中获得任何结果。
否则我得到了以下输出:
检测到内存泄漏! 转储对象 - &gt; c:\ users [user] \ documents \ visual studio 2012 \ projects \ leak \ main.cpp(23):{78}正常块位于0x003E8A50,长度为20个字节。
数据:&lt; &GT; CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD
c:\ users [user] \ documents \ visual studio 2012 \ projects \ leak \ main.cpp(21):{77}正常块位于0x003E9F80,长度为20个字节。
数据:&lt; &GT; CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD
对象转储完成。
在return
语句之前删除已分配的内存时,也没有输出:
free(myArrayCAlloc);
delete[] myArrayCppAlloc;
正如你所指出的那样:
当我调试时,_CrtDumpMemoryLeaks()已经真正执行
在文档中:
如果您的应用程序未定义_CRTDBG_MAP_ALLOC,_CrtDumpMemoryLeaks将显示内存泄漏报告
因此,如果您想使用_CRTDBG_MAP_ALLOC
,则需要使用_CrtSetDbgFlag
,但这似乎是参考的间接后果。
答案 3 :(得分:0)
请检查
Build / Configuration manager...
。您的解决方案可能已设置为“调试”模式,但仍会在发布模式下构建一些项目。