当前位置:   article > 正文

重载全局和成员new/delete_全局重载

全局重载

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/876199
推荐阅读
相关标签
  

闽ICP备14008679号