实现new和delete的重载

有两种方式:

1.覆盖默认定义的全局方式

2.只针对一个类的局部方式

new的一般语法形式:

void* operator new(size_t size)

{

//使用new运算符分配size大小的内存空间

}

delete的一般语法形式

void operator delete(void *point)

{

//使用delete释放point所指向的内存空间

}

new和delete可以被全局重载:

#include<iostream>
using namespace std;
class loc
{
public:
    loc(int i,int j);
    void print();
    void* operator new(size_t size);
    void operator delete(void *point);
private:
    int weight,hight;
};
loc::loc(int i,int j)
{
    weight=i;
    hight=j;
}
void loc::print()
{
    cout<<weight*hight<<endl;
}
void* loc::operator new(size_t size)
{
    cout<<"分配内存"<<endl;
    return malloc(size);
}
void loc::operator delete(void* point)
{
    cout<<"释放内存"<<endl;
    free(point);
}
int main()
{
    loc* p=new loc(20,30);
    p->print();
    delete(p);
    return 0;
}


在C++中,可以重载newdelete运算符以定制动态内存管理的行为。重载new运算符可以用于自定义内存分配的方式,而重载delete运算符可以用于自定义内存释放的方式。 重载new运算符的一种常见方式是定义一个全局new运算符函数,并使用该函数来执行内存分配。例如: ```cpp void* operator new(size_t size) { // 自定义内存分配逻辑 void* ptr = malloc(size); // 检查分配是否成功 if (ptr == nullptr) { throw std::bad_alloc(); } return ptr; } ``` 重载delete运算符的一种常见方式是定义一个全局delete运算符函数,并使用该函数来执行内存释放。例如: ```cpp void operator delete(void* ptr) noexcept { // 自定义内存释放逻辑 free(ptr); } ``` 需要注意的是,如果重载new运算符,通常也需要相应地重载delete运算符,以确保内存的正确释放。 可以根据需要重载其他版本的newdelete运算符,例如带有额外参数的newdelete运算符,数组形式的newdelete运算符等。重载这些运算符时需要遵循一定的规则和约定,确保正确性和可靠性。 值得注意的是,C++11引入了更加灵活和安全的内存管理方式,例如智能指针(如std::shared_ptr和std::unique_ptr)和RAII(资源获取即初始化)等,这些方式可以减少手动管理内存的复杂性和错误。因此,在使用newdelete运算符进行内存管理之前,建议先考虑这些更高级的内存管理工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值