C++ 内存管理之重载operator new 和operator delete-程序员宅基地

技术标签: C++内存管理  

当我们在C++中使用new 和delete时,其实执行的是全局的::operator new和::operator delete。首先我们来看一个简单的例子。

class Foo{
   ...}
Foo* pf = new Foo;
delete pf

上面的代码底层执行的是什么呢?

首先new包含两阶段的操作。
(1)首先调用::operator new分配内存 (2)调用Foo::Foo() 构造对象内容
然后是delete也分两部分的操作。
(1)首先调用Foo::~Foo()将对象析构 (2)调用::operator delete释放内存
那么可以对::operator new::operator delete进行重载么,当然是肯定的
见代码:

#include<iostream>
using namespace std;

class Foo
{
    public:
        int _id;
        long _data;
        string _str;
    public:
        Foo():_id(0){
   cout<<"default ctor.this="<<this<<" id="<<_id<<endl;}
        Foo(int i):_id(i){
   cout<<"ctor.this="<<this<<" id="<<_id<<endl;}
        ~Foo() {
   cout<<"dtor.this="<<this<<" id="<<_id<<endl;}
        static void* operator new(size_t size);
        static void operator delete(void* pdead,size_t size);
        static void* operator new[](size_t size);
        static void operator delete[](void* pdead,size_t size);
};

void* Foo::operator new(size_t size)
{
    Foo* p = (Foo *)malloc(size);
    cout<<"调用了Foo::operator new"<<endl;
    return p;
}

void Foo::operator delete(void *pdead,size_t size)
{
    cout<<"调用了Foo::operator delete"<<endl;
    free(pdead);
}
void* Foo::operator new[](size_t size)
{
    Foo* p  = (Foo*)malloc(size);
    cout<<"调用了Foo::operator new[]"<<endl;
    return p;
}

void Foo::operator delete[](void *pdead, size_t size)
{
    cout<<"调用了Foo::operator delete[]"<<endl;
    free(pdead);
}

int main()
{
    Foo* pf = new Foo(7);
    Foo* pf1 = new Foo[10];
    delete pf;
    delete[] pf1;
}

最后的运行结果是:
这里写图片描述
最后看结果和我们预想的一样,::operator new::operator delete都被重载了,并且执行顺序也是我们预想的

但是如果使用全局的::operator new::operator delete会怎么样呢??

int main()
{
    Foo* pf = ::new Foo(7);
    Foo* pf1 = ::new Foo[10];
    ::delete pf;
    ::delete[] pf1;
}

运行结果:
这里写图片描述
看到我们重载的函数被屏蔽了,因为使用的是全局的operator newoperator delete

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014303647/article/details/80328317

智能推荐

概率论总结_p(∪n i=1ai) ≤ pn i=1 p(ai)-程序员宅基地

文章浏览阅读823次,点赞2次,收藏13次。随机事件与概率基本概念随机试验试验可以在相同的条件下重复进行试验所有可能结果是明确可知道的,并且不止一个每一次试验会出现哪一个结果,事先并不确定事件随机事件A,B,C...A,B,C...A,B,C...必然事件Ω\OmegaΩ不可能事件∅\varnothing∅样本空间样本点:随机试验的每一个可能结果称为样本点,记为ω\omegaω样本空间:样本点的全体组成的集合称为样本空间,记为Ω\OmegaΩ基本事件:由一个样本点构成的事件称为基本事件随机事件AAA是由若干个基本_p(∪n i=1ai) ≤ pn i=1 p(ai)

Nuxt中使用Vuex(新版,简单入门)_nuxt vuex-程序员宅基地

文章浏览阅读8.5k次,点赞2次,收藏17次。1.前言因为我学的是后端开发,前端不是很厉害,如果有什么不对的地方请评论指出,谢谢!看这篇文章你需要对Vuex有一定的了解 官方链接做课设的时候使用到了Nuxt框架,需要做登录,也就结识了Vuex,其实以前就学过Vuex,但是一直不知道这个东西有什么优势,特点。这次我在实际使用中就用到了一个非常好用的特点,官方的解释如下:Vuex 的状态存储是响应式的。当 Vue 组件从 store ..._nuxt vuex

vue点击按钮改变按钮样式_vue点击按钮切换样式-程序员宅基地

文章浏览阅读3.7k次。【代码】vue点击按钮改变按钮样式。_vue点击按钮切换样式

图论学习-最短路模型-程序员宅基地

文章浏览阅读2k次,点赞20次,收藏44次。这里只是我对于最短路模型学习的一个记录,不正确的地方希望大家指出。文章目录最短路模型一、 什么是最短路?1.1 概念1.2 基本术语二、主要模型2.1 dijkstra2.1.1 步骤2.1.2 画图理解2.1.3 为什么dijkstra不能处理负权边?2.2 堆优化的dijkstra2.3 bellman_ford2.3.1 三角形不等式2.3.2 步骤2.3.3 代码实现2.4 spfa2.4.1 步骤2.4.2 代码实现2.4.3 主要问题2.5 floyd三、练习题目四、参考最短路模型一、 什_最短路模型

20210409因为内存条的兼容问题引起的编译aosp10莫名的异常_aosp 编译 segmentation fault-程序员宅基地

文章浏览阅读2.7k次。20210409因为内存条的兼容问题引起的编译aosp10莫名的异常内存使用2条32GB的内存条(3000MHz)https://item.jd.com/10025021240070.html酷兽(CUSO)ddr4 32g台式机内存 32g 3000MHz 酷兽夜枭系列【京选存储.稳定兼容】酷兽存储.实惠装机能手(内存终身保固.以换代修)京 东 价¥ 769.00 降价通知32g 3000MHz电脑使用的:dell的Inspiron-3880rootroot@rootroot-Ins_aosp 编译 segmentation fault

SSL_1072&&P2347【砝码称重】-程序员宅基地

文章浏览阅读72次。砝码称重题目设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),要求:输入方式:a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)输出方式:N(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)Sample Input1 1 0 0 0 0(注:下划线表示空格)Sample Output3//表示可以称出1g,2g,3g三种不同的重量。解析啊就这?!堂堂1996年分区联赛提高组第

随便推点

BZOJ 2301 [HAOI2011]Problem b(莫比乌斯反演)_[bzoj2301][haoi2011]-程序员宅基地

文章浏览阅读139次。题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2301咱也不知道莫比乌斯函数,莫比乌斯反演怎么来的,直接用就得了...①莫比乌斯函数:else表示质因子分解后有质因子出现一次以上莫比乌斯函数跟着欧拉筛跑一遍就可以求出来②莫比乌斯反演的两种写法:其中f(i)是题目询问的东西,你发现直接求求..._[bzoj2301][haoi2011]

SpringBoot多文件压缩包下载(多附件zip格式)_springboot下载多个文件-程序员宅基地

文章浏览阅读7.4k次。文章目录前言 : 此 Demo 为 Windows 环境下演示,部署到服务器的话路径需改成服务器的路径。一、自定义工具类DownLoadZipUtil二、Dao层分析与sqlmapper层代码(DAO)三、Service层代码三、Controller层代码注意 : 文件的打包下载这里用到了临时路径,下面只需要关注方法ZipTempDownLoad即可,下面的代码实际需根据自己的逻辑需求去写。四、前端部分代码,此Demo前端用的vue五、效果展示前言 : 此 Demo 为 Windows 环境下演示,部_springboot下载多个文件

meta SEO(给搜索引擎看的meta标签 name keywords)_搜索 <meta name="keywords" content="氢能源、燃料、电池技术、清洁能源-程序员宅基地

文章浏览阅读1.8k次。<!-- 你挂载到域名上才有用 --> <meta name="keywords" content="游戏,音乐,体育">_搜索

CVPR2019 主动学习方面论文_cvpr 2019 active learning-程序员宅基地

文章浏览阅读498次。1 Learning Loss for Active Learning 论文下载直接预测样本的LossCVPR2019 论文接受列表_cvpr 2019 active learning

通信原理chapter2总结(内含多径效应和多普勒效应MATLAB仿真)_多普勒效应和多径效应 建模-程序员宅基地

文章浏览阅读4.8k次,点赞12次,收藏67次。第二章总结1.信道:通信系统中信道是指发送设备到接收设备之间信号传输的通道,是通信系统中的一个重要组成部分。2.分类:1)按照传输媒介:无线信道和有线信道;2)根据信道研究对象不同:调制信道,编码信道3)按照信道的冲激响应是否随时间变化:恒参信道,随参信道4)按照信道输入和输出符号是否离散:离散信道,连续信道3. 简介1)有线信道:利用人造的传导电或光信号的媒质来传输信号,如明线,..._多普勒效应和多径效应 建模

富士通01018z平板电脑评测_微软Surface Pro 7详细评测:仍旧是最好的二合一平板电脑...-程序员宅基地

文章浏览阅读1k次。今年10月初,当人们还沉浸在国庆放假的喜悦中的时候,大洋彼岸的微软在纽约召开新品发布会,一口气发布了6款Surface设备,除了惊艳的双屏电脑Surface Neo以及传说中的“Surface Phone”以不一样的形态和消费者见面之外,升级版的微软Surface Pro 7也是本次发布会的最大看点之一,微软Surface Pro 7跟着英特尔的节奏升级到了10代酷睿处理器,另外的一个看点则是增加..._farq01018z

推荐文章

热门文章

相关标签