重载全局new/delete实现内存检测

2023-05-16

下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用newdelete运算符时就会调用重载过的operator newoperator delete,在重载的operator new里和operator delete里记录下内存申请和释放信息,从而判断内存使用情况。

下面一步步介绍它的实现!

1、  全局new/delete的重载

先看一下重载new/delete的规则:

重载的operator new的参数个数任意,但第一个参数必须是size_t类型的,返回值必须是void*。重载operator delete只允许有一个参数,且是void*型。

当然,不光要重载operator new operator delete, 还要重载operator new [], operator delete [],更多operator newoperator delete重载的内容参考《Effective C++

重载的new/delete, new[]/delete[]代码如下:

void * operator new (size_t size){

if(0 == size){

        return 0;

}

void *p = malloc(size);

return p;

}

 

void * operator new [](size_t size){

return operator new(size);

}

 

void operator delete (void * pointer){

if(0 != pointer){

free(pointer);

}

}

 

void operator delete[](void * pointer){

       operator delete(pointer);

}

 

2、  __FILE__, __LINE__记录new的位置

为了找到内存泄露的元凶,我要记录下每一处new所在的文件名和所在行。于是再次重载了operator new

void * operator new (size_t size, const char* file, const size_t line);

void * operator new [](size_t size, const char* file, const size_t line);

为了避免编译时出现warning C4291(没有与operator new(unsigned int,const char *,const unsigned int) 匹配的delete),又重载了

void operator delete (void * pointer, const char* file, const size_t line)

void operator delete[](void * pointer, const char* file, const size_t line)

              尽管我知道它没用。

我想到了用系统提供的__FILE__ __LINE__宏获取当前文件名与行号,我试图把__FILE__ __LINE__直接填到operator newoperator new[]函数体里边,然后把函数置成inline,结果都输出的是重载operator newoperator new[]的文件和函数体printf函数所在行。然后又试了将operator new的缺省参数设为__FILE__ __LINE__结果依然,于是想到了用宏定义。

先看看MFC里的做法,MFC为了调试方便,对new进行了宏定义:

#define new DEBUG_NEW

#define DEBUG_NEW new(THIS_FILE, __LINE__)

 

这里我借用MFC的做法,我也用宏定义:

void * operator new (size_t size, const char* file, const size_t line)

void * operator new [](size_t size, const char* file, const size_t line)

#define MC_NEW new(__FILE__, __LINE__)

#define new MC_NEW

 

 

3、  malloc/free new/delete替换

为了便于统计malloc/free信息,也用宏定义的方法处理:

#define malloc(s) ((void*)new unsigned char[s])

#define free(p)   (delete [] (char*)(p));

 

4、  在数据结构里存储内存使用情况。

            下面写一个用于存储new/delete中内存信息的数据结构,可以使用链表,也可以使用哈希表,这里选用哈希表,写一个CHash类。

代码略。

 

5、  为了保证CHash在所有对象析构执行完之后再销毁,应该将CHash放在全局存储区,将其设成static类型,另外,如果有多个static,还需要注意放置的顺序。

 

到这里这个简易的内存泄露检测工具完成了,但目前还不能用于多线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重载全局new/delete实现内存检测 的相关文章

随机推荐

  • 什么是端到端(end-to-end)的神经网络

    端到端指的是输入是原始数据 xff0c 输出是最后的结果 而非端到端呢 xff0c 就是输入不是直接的原始数据 xff0c 而是在原始数据中提取的特征 如feature xff0c 这一点在图像问题上尤为突出 因为图像像素数太多 xff0c
  • 微策略MicroStrategy校园招聘2013.10.21面试题

    全程英语口语回答 xff1a 一面 计算机基础 1 判断一个字符串是否回文 2 如何快速找出一个有序数组中a i 61 i的那个元素 分析 xff1a 对于任意的j和i xff0c 如果j gt i则A j gt 61 A i 假设所求的解
  • 算法分析与设计作业六——选择问题

    1 问题 选择问题 xff08 Selection Problem xff09 xff0c 即在n个元素的集合中寻找第K小的元素的问题 2 解析 3 设计 将S划分成 span class token number 5 span 个一组 x
  • Spring框架详解

    目录 什么是Spring框架 Spring的特点 什么是IOC 基于xml的IOC xff1a 基于注解的IOC xff1a 添加包扫描的方式 为应用指定多个 Spring 配置文件 spring配置文件的整合 xff1a 基于xml的IO
  • 干货分享:Android Studio 学习之 Debug 调试

    前言 正所谓 xff0c 工欲善其事必先利其器 xff0c 对于一个程序员来说 xff0c IDE就是我们器啊 IDE掌控的越熟悉 xff0c 工作效率就越高 划水摸鱼的时间更多 xff0c 所以要想效果更高 摸更多的鱼 xff0c 就要好
  • 生产者——消费者问题算法的实现

    一 实验内容 一组生产者向一组消费者提供消息 xff0c 它们共享一个有界缓冲池 xff0c 生产者向其中投放消息 xff0c 消费者从中取得消息 消费者从中取得消息 假定这些生产者和消费者互相等效 xff0c 只要缓冲池未满 xff0c
  • KNN算法(K临近算法)及使用KNN算法实现手写数字0-9识别

    首先感谢博主倔强的小彬雅 xff0c 本文使用的素材及部分代码来源其博文机器学习入门 用KNN实现手写数字图片识别 xff08 包含自己图片转化 xff09 xff0c 需要下载素材的可以到其博文最后进行下载 关于KNN算法 knn算法也叫
  • IDEA启动报Plugin Error解决办法

    Problems found loading plugins Plugin 34 Persistence Frameworks Support 34 was not loaded required plugin 34 Database To
  • (新版)idea设置Maven仓库阿里云镜像

    idea设置Maven仓库阿里云镜像 参考这个文档 xff0c https www itsvse com thread 7045 1 1 html 出处 架构师 程序员 其实就是官方简化版本 官方文档 xff1a https help al
  • MySQL创建触发器的时候报1419错误( 1419 - You do not have the SUPER privilege and binary logging is enabled )...

    grant all privileges on to root 64 39 39 identified by 39 CTjetrrrr 39 with grant option 给用户权限 解决方法 xff1a 第一步 xff0c 用roo
  • console控制台打印字符画

    效果图 废话不多说直接上代码 控制台打印字符画 64 param stringTem 64 returns String function makeMulti stringTem let l 61 new String stringTem
  • sourceTree 变基

    master xff1a 主分支 self dev 自己的分支 假设我们整个团队在master分支上开发 1 xff1a 首先拉取master分支到本地 xff0c 再利用本地的master分支新建一个self dev分支 xff0c 自己
  • 远程桌面登录Ubuntu系统(ubuntu下命令行设置wifi自动连接)

    由于各种条件的限制 xff0c 有时候在进行ubuntu嵌入式开发的时候不得不使用命令行来操作 我在笔记本上设置了一个wifi热点 xff0c 希望我的开发板 xff08 Odroid XU3 xff09 开机后自动连接上指定的wif热点
  • canvas 绘制心电图

    使用canvas绘制心电图 下载链接 ECGhtmlcanvas绘制心电图 Javascript文档类资源 CSDN下载
  • 在github上搭建hexo个人博客(Linux-Ubuntu)

    什么是 Hexo xff1f Hexo 是一个博客框架 xff0c 用来生成静态网页 安装前提 安装 Hexo 很简单 但是在安装前 xff0c 需要检查电脑里有没有这两样东西 Node js Git 以下安装都是基于Ubuntu平台下 安
  • Settings源码分析

    Settings源码分析 4 2 1 拿到一份代码 xff0c 首先是找到它的入口 xff0c 一步一步往里看 Settings AndroidManifest xml lt activity android name 61 34 Sett
  • 深入学习RabbitMQ(三):channel的confirm模式

    上一篇博客我们介绍了使用RabbitMQ可能会遇到的一个问题 xff0c 即生产者不知道消息是否真正到达broker代理服务器 xff0c 随后通过AMQP协议层面为我们提供的事务机制解决了这个问题 xff0c 但是采用事务机制实现会降低R
  • 操作系统(四):动态链接与静态链接的区别

    在回答这个问题之前希望大家大概了解一个文件编译的过程 xff0c 比如一个C文件在编译成功后文件夹里的文件会有什么变化 xff0c 大家可以先去创建一个helloworld c的文件 xff0c 观察其编译后的变化 那么问题来了 面试官经常
  • 树莓派CM4_Tiny(双HDMI)扩展板在Ubuntu Desktop下驱动OV5647摄像头的操作演示

    关键词 xff1a 树莓派 Compute Module CM4 双HDMI Ubuntu Camera OV5647 概述 xff1a Raspberry Pi Camera是树莓派硬件平台的官方摄像头模块 xff0c 国内有很多兼容摄像
  • 重载全局new/delete实现内存检测

    下面介绍用重载 new delete 运算符的方式来实现一个简单的内存泄露检测工具 xff0c 基本思想是重载全局 new delete 运算符 xff0c 被检测代码调用 new 和 delete 运算符时就会调用重载过的 operato