Java教程

内存泄露检测方案分析

本文主要是介绍内存泄露检测方案分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

思路分析

通过重载全局内存申请以及释放函数,记录申请和释放相关信息,在申请时,以申请到的内存地址为key,申请者的相关信息为value,建立映射关系。应用程序主动释放时,删除对应的信息。

当整个程序退出时,检查该map是否为空,如果不为空,则打印出内部信息,即可发现哪里有内存泄露。

概要设计

使用以下宏定义来重定义new

// 外部使用时是这样进行重定义
#define new DEBUG_MEMORY_LEAK_CHECK_NEW

在泄露检测工具内部,可以这样定义:

#if defined(_DEBUG)
	#define	DEBUG_MEMORY_LEAK_CHECK_NEW new(__FILE__, __LINE__)
#else
	#define	DEBUG_MEMORY_LEAK_CHECK_NEW new
#endif

接着,重定义全局申请操作符

void* operator new(size_t size, const char* pFileName, int nLineNum)
{
	void* p = operator new(size);
	if (p)
	{
		// 将内存分配相关信息保存到全局map
	}
}

void operator delete(void* ptr, const char* pFileName, int nLineNum)
{
	// 从全局map中删除ptr对应的内存分配信息
	free(ptr);
}

注意,在进行重载 operator new 时,它是支持可变参数的,只需要保证第一个参数为 size_t 即可

这篇关于内存泄露检测方案分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!