内存分配有两种方式,malloc 和 new,C++的new完全可以代替C语音的malloc。
平时在vs下面,在程序退出的时候也只能看见内存泄露的提示,不能指定具体文件及位置。那么,怎么能找到所在文件和位置呢?
首先,声明如下:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
然后,在程序退出时调用_CrtDumpMemoryLeaks();
其实这两个步骤就可以用了。
但是,对于同一位置的重复内存申请,需要跟踪哪次内存在泄露,这时,可以用
_CrtSetBreakAlloc(N);
或者:
设置项目属性“在静态库中使用 MFC”;然后在watch(监视)窗口中输入
_crtBreakAlloc ,在Value(值)里面输入整数(N),那么程序将在第N次申请内存时中断。这个N取决于泄露的位置,如:
d:/vs8test/vs8testdlg.cpp(2077) : {84} normal block at 0x00FC6B70, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
大括号中的84就是N。
我在MS8中测试,malloc 泄露检测有问题。但这不影响,因为开始也说了,new完全可以替代malloc。
测试时我还发现
_CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF| _CRTDBG_CHECK_ALWAYS_DF);或者
_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG | _CRTDBG_LEAK_CHECK_DF| _CRTDBG_CHECK_ALWAYS_DF);
也不好用。
内存快照,用于获取内存的状态:
_CrtMemState s1; // _CrtMemState
_CrtMemCheckpoint( &s1 );
_CrtMemDumpStatistics( &s1 ); //用来输出s1的内容
本文介绍如何在Visual Studio中定位内存泄漏的具体位置。通过定义宏并包含必要的头文件,配合使用_CrtDumpMemoryLeaks()函数,可以有效检测内存泄漏。此外,文章还介绍了如何利用_CrtSetBreakAlloc()进行更精确的泄漏源定位。
1519

被折叠的 条评论
为什么被折叠?



