重载new/delete运算符

2023-05-16

下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator new和operator 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 new和operator 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 new和operator new[]函数体里边,然后把函数置成inline,结果都输出的是重载operator new和operator 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运算符 的相关文章

  • 1. 两数之和【return new int[]{i, j}、hashtable.containsKey()、get、put】

    1 两数之和 给定一个整数数组 nums 和一个整数目标值 target xff0c 请你在该数组中找出 和为目标值 target 的那 两个 整数 xff0c 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 xff0c 数
  • c#中new一个对象以后,是否需要手动释放?

    c 中new一个对象以后 xff0c 是否需要手动释放 xff1f 2012 04 28 23 43 wshbfzdzb 分类 xff1a C NET 浏览723次 c 43 43 中 class1 a 61 new class1 需要在用
  • 智能指针 std::auto_ptr 和 shared_ptr

    转载 http blog sina com cn s blog 508938e10100f12x html auto ptr 类可以用于管理由 new 分配的单个对象 但是无法管理动态分配的数组 我们通常不会使用数组 而是使用 vector
  • 通过修改注册表设置代理

    reg add HKCU Software Microsoft Windows CurrentVersion Internet Settings v ProxyEnable t REG DWORD d 1 f 作用 使用自动配置脚本 reg
  • 根据GUID获得设备路径(转载)

    根据GUID获得设备路径 include
  • c++ new与delete与qt内存回收机制

    在c primer中读到 new 是在堆里面申请一段内存资源 new必须与delete成对使用 否则就会造成内存泄漏 可最近学qt 我经常可以看见只new而不delete的情况 是不是这样就内存溢出了 非也 百度了一下qt的内存管理机制 才
  • c++函数返回引用

    转自 http www cnblogs com floatedclouds archive 2011 10 13 2209917 html 1 什么是引用 引用就是变量的别名 操作一个变量的引用也就相当于操作变量本身 这一点跟指针很类似 但
  • 基数排序比快速排序快

    最近在关于算法的书籍 本以为以前看过的算法书都说快速排序是最好的排序算法 也没有想过 闲着无聊变写了一个关于基数排序的算法简单分析了一下应该时间复杂度比快速排序 小 于是编程实现果然结果要比快速排序 快 对两者都 1000000个数排序快速
  • do...while(0)的妙用

    在C 中 有三种类型的循环语句 for while 和do while 但是在一般应用中作循环时 我们可能用for和while要多一些 do while相对不受重视 但是 最近在读我们项目的代码时 却发现了do while的一些十分聪明的用
  • OpenBSD cvsup更新

    安装了 OpenBSD 后你会发现它很小个 只有500多M 当然里面只有ssh sendmail功能 dev wd0a 130M 38 8M 84 7M 31 dev wd0h 95 5G 16 0K 90 8G 0 home dev wd
  • ASCII码详解

    ASCII码表 ASCII码大致可以分作三部分組成 第一部分是 ASCII非打印控制字符 第二部分是 ASCII打印字符 第三部分是 扩展ASCII打印字符 第一部分 ASCII非打印控制字符表 ASCII表上的数字0 31分配给了控制字符
  • 快速删除系统服务命令 sc delete ServiceName

    快速删除系统服务命令 sc delete ServiceName 要删除名为ServiceName的服务 可以用XP自带服务管理工具 SCP sc exe命令用以下命令即可删除指定的服务 sc delete ServiceName这些命令的
  • 介绍一种巧妙的删除程序自己的方法

    介绍一种巧妙的删除程序自己的方法 vcbear 近日看到网友询问如何实现程序运行之后把自己删除的方法 不知大家对木马甚么的兴趣实在太浓 还是想要这样的效果 用户只要一运行程序 可执行文件就没有了 可是程序还是在跑 胆小的只怕要喊 鬼呀 老婆
  • 指针以及内存分配

    1 指针很灵活 这使得指针很难管理 在定义指针时 将在栈中开辟一块内存存放指针的地址 栈内的内存由系统分配和释放 指针的地址内存只是存放指针的地址 不存放指针指向的数据 值得注意的是 定义指针时指针会随机指向一块内存 如int p p会指向
  • C++并不难—之内存分配

    很多人都觉得学习C 是特别困难的事情 C 学习是比较复杂的 它的内存分配 指针 以及面向对象思想的实现等等 确实需要一定的技术积累 我们将以专题的形式 为大家逐一剖析c 的技术重点和难点 本专题讨论的就是内存分配 学习c 如果不了解内存分配
  • delete 和 delete []的真正区别

    c 中对new申请的内存的释放方式有delete和delete 两种方式 到底这两者有什么区别呢 1 我们通常从教科书上看到这样的说明 delete 释放new分配的单个对象指针指向的内存 delete 释放new分配的对象数组指针指向的内
  • 如何在 Linux 中删除超过 30 天的文件

    定期从服务器中清除旧的未使用文件是最佳实践 例如 如果我们每天 每小时在服务器上运行文件或数据库备份 那么服务器上将会产生很多垃圾 所以要定期清洁 为此 您可以从备份目录中找到旧文件并清理它们 本文向您介绍如何查找和删除超过 30 天的文件
  • word 封面 目录不要页码 从第三页正文开始要页码的 设置 方法

    原文网址为http hi baidu com liufeispy blog item c7318d01d69aaed7277fb524 html 封面 目录不要页码 从第三页正文开始要页码的 设置 方法 1 鼠标放在正文页 即你的第三页 首
  • Proc批量处理需要注意的问题

    ProC中批量读取游标中的数据的时候 需要注意 最后一次批量读取游标中的数据的时候 数据被取到HostArray中 同时sqlca sqlcode被置为1403 NO DATA FOUND 如果在fetch后立即判断sqlca sqlcod
  • C++面试题目集合(持续跟新)

    与我前面写的C语言进阶知识点遥相呼应 这才是C 面试 网上的面试题有些太简单了 C 面试题目最多集中在对象的内存模型 记住了 如果用c c 内存都不清楚 还写个屁的程序 1 C 的虚函数是怎样实现的 C 的虚函数使用了一个虚函数表来存放了每

随机推荐

  • 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法

    matlab 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法 xff0c 它们是 自回归 AR 移动平均线自回归移动平均线自回归积分移动平均线 ARIMA 季节性自回归积分移动平均线 SARIMA 具有外生回归
  • Android自定义定时闹钟开发详解

    导读这篇文章主要为大家详细介绍了Android自定义定时闹钟开发 xff0c 文中示例代码介绍的非常详细 xff0c 具有一定的参考价值 xff0c 感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Android开发之自定义闹钟实现 xf
  • 如何在 Linux 上安装 AWS 命令行工具

    导读AWS CLI 是一个能够和 AWS 账户进行交互的命令行程序 开发者和系统管理员用它管理日常的活动和自动化 本文讲述如何一步步在 Linux 上安装 AWS CLI xff08 命令行工具 xff09 AWS CLI 是一个能够和 A
  • Python实现对比两个Excel数据内容并标出不同

    导读 日常工作中需要对比两个Excel工作表中的数据差异是很不方便的 xff0c 使用python来做就比较简单了 xff01 本文为大家介绍了python实现对比两个Excel的数据内容并标记出不同数据的示例代码 xff0c 需要的可以参
  • Python中列表遍历使用range和enumerate的区别

    导读这篇文章主要介绍了Python中列表遍历使用range和enumerate的区别 在Python编程语言中 xff0c 遍历list有range和enumerate方法 xff0c 本文结合示例代码给大家介绍的非常详细 xff0c 对大
  • ChatGPT 引入关闭聊天记录功能

    导读OpenAI 宣布在 ChatGPT 中引入了一项新功能 xff0c 允许用户关闭聊天记录 相关控件目前已面向所有用户推出 xff0c 可以在 ChatGPT 的设置中找到 xff0c 并且可以随时更改 公告指出 xff0c 用户在禁用
  • 虚拟机与主机互传文件方法分享

    现在虚拟机的使用已经非常普及 xff0c 无论新手学习 xff0c 还是运维工程师搭建虚拟化平台 xff0c 都会使用到虚拟机 对个人用户来说 xff0c 非常方便就能搭建很多操作系统进行学习 xff1b 对企业用户来说更是降低了服务器的硬
  • 在 Centos7 的KVM上启用嵌套虚拟化

    嵌套虚拟化 意味着在虚拟机内配置虚拟化环境 换句话说 xff0c 我们可以说嵌套虚拟化是虚拟机管理程序hypervisor的一个特性 xff0c 它允许我们通过虚拟化管理程序 xff08 宿主机 xff09 的硬件加速在虚拟服务器内安装和运
  • 详解:Linux Chrony 设置服务器集群同步时间

    导读Chrony是一个开源的自由软件 xff0c 像CentOS 7或基于RHEL 7操作系统 xff0c 已经是默认服务 xff0c 默认配置文件在 etc chrony conf 它能保持系统时间与时间服务器 xff08 NTP xff
  • Linux:快速查看IP地址及修改IP地址

    导读Linux下如何快速查看IP地址及修改IP地址 xff0c 有一个方法供参考 查ip 方法 步骤1 打开linux操作系统在进入到界面 方法 步骤2 在桌面右击打开终端 方法 步骤3 终端里输入ifconfig a命令在回车键 方法 步
  • Centos安装vncserver虚拟网络控制台

    虚拟网络控制台 xff08 VNC xff09 是一个图形桌面共享软件 xff0c 允许您使用键盘和鼠标远程控制另一台计算机 系统环境 服务端 xff1a Centos7 7 Minimal客户端 xff1a Windows10客户端VNC
  • java线程池线程超时关闭的两种我认为比较好的方式

    问题 xff1a 比如多线程进行io操作的时候 xff0c io的读取在等待的时候 xff08 比如telnet某端口时 xff0c 会长时间等待 xff09 xff0c 线程是不会关闭的 xff0c 这样导致线程不释放 xff0c 早晚凉
  • Ubantu 22.04.2安装教程 + VMWare Tools + 百度网盘 + Anaconda + Pycharm安装

    目录 前言 一 Ubantu安装 二 VMWare Tools安装 三 百度网盘安装 四 Anaconda 五 Pycharm 前言 最近在研究Linux xff0c 决定整合一下教程 xff0c 以便日后的师弟师妹使用 一 Ubantu安
  • 个性化定制你的命令行

    如果您很容易使shell 提示行变得色彩绚烂斓且带有更多信息 xff0c 为什么还要坚持用单调的标准 shell 提示行呢 xff1f 在这篇技巧中 xff0c Daniel Robbins 将说明如何获得符合您的意愿的shell提示行 x
  • Android中viewBinding的简单用法

    初级菜鸟 xff0c 正在向中级菜鸟努力 xff01 刚刚接触Android开发 xff0c 有好多东西都不太懂 xff0c 又喜欢忘东西 xff0c 干脆写博客记录一下吧 目录 在activity中使用viewBinding 在Fragm
  • python爬虫实战 | 批量爬取开放服务器的文件

    今天在查有关spss modeler的参考资料时 xff0c 发现了这个网站 xff1a ftp public dhe ibm com software analytics spss documentation modeler 14 2 z
  • 一个图的连通子图个数

    问题描述 xff1a 给出一个无向图 xff0c 输出图中连通分支的个数 无向图的连通分支是一个子图 xff0c 因此在子图两个节点之间至少存在一个路径 输入 xff1a 给出一个连通图的二维数组 01000 10100 01000 000
  • IT牛人博客聚合 - Linode日本东京机房速度飞快 编程牛人 技术牛人

    为了应对亚太地域快速增加的需求 Linode起头把机房建在亚洲了 第一个 Linode 亚洲机房选择在日本东京 我测了下 速度比本来在美国加州快多了 应当首要得益于收集延时的削减 所以 我当即开了张 Support Ticket 将我的 V
  • kali tightvncserver 自启动

    kali创建service自启动 xff0c 文件如下 xff0c kali2021版真的改了好多 xff0c 在这里记录一下 Unit Description 61 TightVNC remote desktop server After
  • 重载new/delete运算符

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