c++:new和delete的运算符重载

目录

前提

new

问题:

结论:

解析:

delete

问题:

结论:

解析:


前提

class Data
{
public:
    Data()
    {
        cout<<__FUNCTION__<<endl;
    }
    ~Data()
    {
        cout<<__FUNCTION__<<endl;
    }
private:
    int m_data;
};

Data *p1 = (Data*)malloc(sizeof(Data));
Data *p2 = new Data;

new

问题:

  • 用malloc会不会调用构造函数?--------- 不会
  • 用new会不会调用构造函数?------------会

结论:

  • new =  malloc + 构造函数

解析:

 在运行这句话的时候(Data *p1 = new Data;),  编译器在编译的时候,会将表达式new Data 转换成 new运算符函数调用 operator new(sizeof(Data))

现在我们重写new运算符函数

    //new 运算符函数重载  在类中定义
    void* operator new(unsigned long long size)
    {
        cout<<"new"<<endl;
        void* p = malloc(size);
        memset(p,0,size);

        return p;
    }

这个函数做了两件事情:

  1. 将表达式转换成 运算符函数调用,在函数里面申请堆空间,并清0  
  2. 自动帮你执行构造函数(先运行重载函数再运行构造)

delete

问题:

  • 用free会不会调用析构函数?--------- 不会
  • 用delete会不会调用析构函数?------------会

结论:

  • delete = free +析构函数

解析:

 在运行这句话的时候(delete p1;),编译器在编译的时候,会将表达式 delete p1 转换成 运算符函数调用  operator delete(p1)

现在我们重写delete运算符函数

    //delete 运算符函数重载
    void operator delete(void*p)
    {
        cout<<"delete"<<endl;
        free(p);
    }

这个函数做了两件事情:

  1. 先执行析构函数 
  2. 将表达式 delete p1 转换成 运算符函数调用  operator delete(p1),然后释放空间

总结

  1. 在重写new的时候要申请堆空间

  2. 在重写delete的时候要释放堆空间
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值