可以重载global的operator new delete 函数,细节如下:

MyNewDelete.h

 #pragma once
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std; class Foo
{
public:
int id;
string str; Foo() : id() { cout << "default ctor.this=" << this << "id=" << id << endl; }
Foo(int i) : id(i) { cout << "ctor.this=" << this << "id=" << id << endl; } //若构造函数为virtual 则Fool对象会多一个指针大小的内存用来存虚指针vptr
~Foo() { cout << "dtor.this=" << this << "id=" << id << endl; }; static void *operator new(size_t size); //重载全局operator new 函数;
static void operator delete(void *pdead, size_t size); //重载全局operator delete函数;
static void *operator new[](size_t size); //重载全局operator new[]函数;
static void operator delete[](void *pdead, size_t size); //重载全局operator delete[]函数;
};

NewDelete.cpp

 #include <iostream>
#include <ostream>
#include "MyNewDelete.h" void *Foo::operator new(size_t size)
{
Foo *p = (Foo *)malloc(size);
cout << "Foo::operator new. size=" << size << " return " << p << endl;
return p;
} void Foo::operator delete(void *pdead, size_t size)
{
cout << "Foo::operator delete. size=" << size << " pdead= " << pdead << endl;
free(pdead);
} void *Foo::operator new[](size_t size)
{
Foo *p = (Foo *)malloc(size * sizeof(Foo));
cout << "Foo::operator new[]. size=" << size * sizeof(Foo) << " return " << p << endl;
return p;
} void Foo::operator delete[](void *pdead, size_t size)
{
cout << "Foo::operator delete[]. size=" << size * sizeof(Foo) << " pdead= " << pdead << endl;
free(pdead);
} int main()
{
cout << sizeof(Foo) << endl;
//若无members 才调用globals
//调用members
Foo *pf = new Foo;
delete pf;
cout << "--------------------------------------------------" << endl;
//调用globals
//Foo *pf = ::new Foo;
//::delete pf; Foo *p = new Foo();
delete p;
cout << "--------------------------------------------------" << endl;
Foo *pArray = new Foo[];
delete[] pArray; return ;
}

重载operator new delete函数的更多相关文章

  1. 从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  2. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  3. 走进C++程序世界-----operator new delete 重载

     在C++ 的世界里,new 和delete 是keyword.而在C的世界里相相应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节.这里就不在过多的介绍了.链接. ...

  4. C++重载new和delete运算符

    内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...

  5. 重载new和delete

    当我们创建一个new表达式时,会发生两件事.首先使用operator new()分配内存,然后调用构造函数.在delete表达式里,调用了析构函数,然后使用operator delete()释放内存. ...

  6. C++ 重载new和delete操作符

    原因: C++标准库提供的new和delete操作符,是一个通用实现,未针对具体对象做具体分析 存在分配器速度慢.小型对象空间浪费严重等问题,不适用于对效率和内存有限制的应用场景   好处: 灵活的内 ...

  7. C++中基于Crt的内存泄漏检测(重载new和delete,记录在Map里)

    尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询. #ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FIL ...

  8. 重载operator new实现检测内存泄漏是否可行

    行与不行,就凭我这水平,说出来未免显示太过自大.不还,我还想根据自己的代码来讨论这个问题. 重载operator new来检测内存只的办法,那就是在new的时候记录指针地址及文件名.行号,在delet ...

  9. 重载new和delete来检测内存泄漏

    重载new和delete来检测内存泄漏 1. 简述 内存泄漏属于资源泄漏的一种,百度百科将内存泄漏分为四种:常发性内存泄漏.偶发性内存泄漏.一次性内存泄漏和隐式内存泄漏.    常发性指:内存泄漏的代 ...

随机推荐

  1. MYSQL之B+TREE索引原理

    1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. 二叉树查找:(binary tree search): O( ...

  2. [翻译] .NET Core 3.0 RC 1 发布

    原文: Announcing .NET Core 3.0 Release Candidate 1 今天,我们宣布推出 .NET Core 3.0 Release Candidate 1.就像 Prev ...

  3. 解决android splash 启动白屏问题

    有时我们会发现 ,在splash 页面启动之前会有那么零点几秒的白屏, 真的很让人抓狂 解决办法其实也很简单 . 1.在style.xml中定义一个样式, 这里引入 splash页面的 图片, 注意不 ...

  4. Redis缓存和数据库一致性问题

    工作中,经常会遇到缓存和数据库数据一致性问题.从理论上设置过期时间,是保证最终一致性的解决方案.这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可 ...

  5. Can't connect to MySQL server on 'localhost' (10038)

    平台:win7 已经安装好数据库,但是 在连接MySQL数据库时发生问题: 经过一系列的资料查找后,得到结论MySQL没有启动 解决方法: 将MySQL加入到Windows的服务中.切换到MySQL安 ...

  6. CentOS在VMware中的安装

    1.启动VMware 2.新建一台虚拟机,选择典型 3.选择稍后安装操作系统 4.选择引导系统为Linux,系统版本为Centos 5.选择安装位置 6.选择最大磁盘容量 7.点击自定义硬件,进行硬件 ...

  7. sersync 实时同步

    1.什么是实时同步 ​ 监控一个目录的变化, 当该目录触发事件(创建\删除\修改) 就执行动作, 这个动作可以是 rsync同步 ,也可以是其他. 2.为什么要实时同步 1.能解决nfs单点故障问题. ...

  8. 论文阅读 | DeepDrawing: A Deep Learning Approach to Graph Drawing

    作者:Yong Wang, Zhihua Jin, Qianwen Wang, Weiwei Cui, Tengfei Ma and Huamin Qu 本文发表于VIS2019, 来自于香港科技大学 ...

  9. Android 使用URLConnection下载音频文件

    本文链接: Android 使用URLConnection下载音频文件 使用MediaPlayer播放在线音频,请参考Android MediaPlayer 播放音频 有时候我们会需要下载音频文件.这 ...

  10. at org.apache.jsp.WEB_002dINF.pages.login_jsp._jspInit( login_jsp.java:22)

    SEVERE: Servlet.service() for servlet jsp threw exception java.lang.NullPointerException at org.apac ...