我想检查程序是否有内存泄漏,找到了this Microsoft article。
我完全按照文章添加了
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
和
_CrtDumpMemoryLeaks();
程序退出时。
它在我的输出窗口中正确转储了所有内存泄漏信息,但问题出在这里:
它不会打印内存泄漏的文件名和行号!
它在文章中说#define _CRTDBG_MAP_ALLOC
它会打印文件名和行号,但对我来说不是。
我的输出看起来像这样
Detected memory leaks!
Dumping objects ->
{3456} normal block at 0x038F81E8, 560 bytes long.
Data: < A B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 E6 42
{3447} normal block at 0x038F8170, 56 bytes long.
Data: < B ^ B > 80 42 90 03 10 02 5E 08 80 42 90 03 00 00 CD CD
{3440} normal block at 0x038F86B0, 840 bytes long.
Data: < A B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 A8 42
...
所以我无法真正解决这个问题......同时按F4去行也不行。
你能帮我吗?
答案 0 :(得分:1)
你#define
错了。为了获得
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
您需要使用:
#define _DEBUG
#define _CRTDBG_MAP_ALLOC
您必须包含_DEBUG
,因为_CRTDBG_MAP_ALLOC
仅适用于_DEBUG
已定义(source)。
同样来自此answer,请确保#define
位于您要检查的cpp文件中。
答案 1 :(得分:0)
看起来顶部的VS2013文档示例中存在拼写错误。它应该是:
#define _CRTDBG_MAP_ALLOC
请注意前导下划线。 VS2005 / 2008文档稍后使用_CRTDBG_MAP_ALLOC
和VS2013文档引用_CRTDBG_MAP_ALLOC
。
您可以检查的其他一些事项:
_CRTDBG_MAP_ALLOC
定义添加到stdafx.h
答案 2 :(得分:0)
我希望这有帮助,如果你没有想出@ A.D,适用于win32应用程序,我们需要覆盖新的运算符。不幸的是,它不适用于MFC应用程序。:(
#define _CRTDBG_MAP_ALLOC
#include<iostream>
#include <crtdbg.h>
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
int main()
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ) ;
char *a = new char[10];
return 0;
}