内存泄漏检测工具

发布时间:2024年01月01日

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又指向了一个新的内存。?

?上面代码,加上之前的调试语句,执行:

如上图,在红圈位置找(输出窗口)?

?

上图就是从输出窗口,找到的内存泄漏的提示信息: 已经给出了哪个文件的第几行,我们只需要找到释放内存即可。?

注意:? 以上我们添加的代码都是为了检测是否有内存泄漏,属于调试性的代码,?所以我们在发行的时候应该将加入的为了调试的代码删除掉,否则会占空间。

文章来源:https://blog.csdn.net/weixin_68026222/article/details/135323770
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。