重载全局和成员new/delete

本文详细介绍了如何在C++中重载全局和成员的new/delete操作符,包括重写全局new/delete以影响所有对象的分配和释放,重写成员new/delete以针对特定类的行为进行定制,以及探讨了placement new的使用和异常处理。通过实例展示了不同情况下new/delete的调用过程,以及在数组分配时额外的空间需求。
摘要由CSDN通过智能技术生成

1. 重写全局new/delete

重载::operator new、::operator delete、::operator new[]、operator delete[]

注意:如果重载的是全局的,所以创建对象时编译器调用operator new、operator delete时都会去调用自己重载的版本;如果重载的类成员operator new,那么只在创建和释放该类对象时编译器调用自己重载的operator new、operator delete版本。

如果Fraction类没有重写本来的new/delete,那么会直接调用全局的new/delete:

class Fraction
{
public:
    Fraction(int num, int den = 1) :m_numerator(num), m_denominator(den) {}
private:
    int m_numerator;//分子
    int m_denominator;//分母
};
void* myAlloc(size_t size)
{
    return malloc(size);
}
inline void* operator new(size_t size)
{
    cout << "调用了重载的全局new\n" << endl;
    return myAlloc(size);
}
void operator delete(void* ptr /*,size_t*/)//第二个参数有默认值,不写也没有影响
{
    cout << "调用了重载的全局delete\n" << endl;
    free(ptr);
}

int main()
{
    Fraction* f = new Fraction(1);//调用了重载的全局new
    delete f;//调用了重载的全局delete
}

2. 重写成员new/delete

重写new和new[]区别就是new只会调用一次构造函数,而new[]会调用多次(次数就是[]内数字)。

class Foo
{
public:
    int m_id;
    long m_data;
    string m_str;
public:
    Foo() :m_id(0) { cout << "无参构造函数调用" << endl; }
    Foo(int i) :m_id(i) { cout << "有参构造函数调用" << endl; }
    ~Foo() { cout << "析构函数调用" << endl; }
    static void* operator new(size_t size)
    {
        cout << "opera
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值