通过重载全局内存申请以及释放函数,记录申请和释放相关信息,在申请时,以申请到的内存地址为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
即可