标签:__ 检测 void operator 内存 DEBUG new 泄露
思路分析
通过重载全局内存申请以及释放函数,记录申请和释放相关信息,在申请时,以申请到的内存地址为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
即可
标签:__,检测,void,operator,内存,DEBUG,new,泄露 来源: https://www.cnblogs.com/cherishui/p/15421719.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。