1. vs/vc(windows下)自带的检测工具
将下面的语句加到需要调试的代码中
#define _CRTDBG_MAP_ALLOC // 像一个开关,去开启一些功能,这个必须放在最上面
#include <stdlib.h>
#include <crtdbg.h>
// 接管new操作符 原理: 就是使用新定义的DBG_NEW去替换代码中的new,然后它会将内存管理起来,已经释放的打上标记,如果执行到最后,
// 有内存没有被释放(未被标记的),那就提示出在第几行存在内存泄漏
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK,__FILE__,__LINE__) // 这个就是检测工具
#define new DBG_NEW
#endif // !DBG_NEW
#endif
// 这个在代码结束之前,使用打印是否还有为释放的内存
// 在代码结束处输出内存泄露信息 // 在调试的输出窗口输出
_CrtDumpMemoryLeaks(); // 当执行到这句,如果还有没释放的内存,就打印处在第几行
示例代码:
#define _CRTDBG_MAP_ALLOC // 像一个开关,去开启一些功能
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
#include <Windows.h>
#include <string.h>
#include <errno.h>
// 接管new操作符 原理: 就是使用新定义的DBG_NEW去替换代码中的new,然后它会将内存管理起来,已经释放的打上标记,如果执行到最后,
// 有内存没有被释放(未被标记的),那就提示出在第几行存在内存泄漏
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK,__FILE__,__LINE__) // 这个就是检测工具
#define new DBG_NEW
#endif // !DBG_NEW
#endif
// 我们可以在调试模式下,添加上面的代码,进行内存泄漏的检测, 但是在发布版本时,基本就没有什么问题了,加上会增加容量,所以
// 发布时就将添加的代码都删除掉
int main(void)
{
// 内存泄漏的例子
int* a = new int[10];
a = new int;
delete a;
// 在代码结束处输出内存泄露信息 // 在调试的输出窗口输出
_CrtDumpMemoryLeaks(); // 当执行到这句,如果还有没释放的内存,就打印处在第几行
system("pause");
return 0;
}
上面的代码:发生了内存泄漏-------- a指向了10个int的空间,没有释放,就直接将a又指向了一个新的内存。
上面代码,加上之前的调试语句,执行:
如上图,在红圈位置找(输出窗口)
上图就是从输出窗口,找到的内存泄漏的提示信息: 已经给出了哪个文件的第几行,我们只需要找到释放内存即可。