zoukankan      html  css  js  c++  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 即可

    作者:浩天之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
    Top
    收藏
    关注
    评论
  • 相关阅读:
    导出查询结果到excle
    导出所选行为excle
    spring security LDAP获取用户信息
    spring security防御会话伪造session攻击
    Linux安装Loadrunner generator
    Centos7 安装gitlab
    kafka 安装部署
    zookeeper 搭建
    Oracle GoldenGate对接 Oracle 11g和Kafka
    suse 11 sp4 设置yast 安装源
  • 原文地址:https://www.cnblogs.com/cherishui/p/15421719.html
Copyright © 2011-2022 走看看