重载new和delete(全局和类自身)

重点:

1.重载了new,就必须重载对应的delete

其中new返回类型为void*,重载需要new和new[]

其中delete输入参数类型为void*,重载需要delete和delete[]

1.重载new的格式:void* operator new(size_t sz)

                               void* operator new[](size_t sz)

1.重载delete的格式:void operator delete(void* m)

                                  void operator delete[](void* m)

重载全局new和delete

//重载全局new
void* operator new(size_t sz)
{
    cout << "new size of:" << sz << endl;
    void* m = malloc(sz);
    if (!m)
    {
        cout << "out of memory" << endl;
    }
    return m;
}

//重载全局new[]
void* operator new[](size_t sz)
{
    cout << "new[] size of:" << sz << endl;
    void* m = malloc(sz);
    if (!m)
    {
        cout << "out of memory" << endl;
    }
    return m;
}

//重载全局delete
void operator delete(void* m)
{
    cout << "delete"<< endl;
    free(m);
}

//重载全局delete[]
void operator delete[](void* m)
{
    cout << "delete[]" << endl;
    free(m);
}

int main()
{
    int* a = new int;
    int* b = new int[10];
    delete a;
    delete[] b;
    return 0;
}

重载类的new和delete

class MyClass
{
public:
    MyClass() = default;
    ~MyClass() = default;

    void* operator new(size_t sz)    //重载new
    {
        cout << "new size of" << sz << endl;
        return new char[sz];
    }
    void* operator new[](size_t sz)  //重载new[]
    {
        cout << "new[] size of" << sz << endl;
        return new char[sz];
    }
    void operator delete(void* m)    //重载delete
    {
        cout << "delete" << endl;
        delete m;
    }
    void operator delete[](void* m)  //重载delete[]
    {
        cout << "delete[]" << endl;
        delete[] m;
    }
private:
    int num[3];
};


int main()
{
    MyClass* mclass = new MyClass;
    cout << "size of" << sizeof(*mclass) << endl;
    delete mclass;

    MyClass* mgroup = new MyClass[2];
    cout << "size of" << sizeof(*mgroup) << endl;
    delete[] mgroup;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值