正确重载新/删除新[] /删除[]

时间:2011-05-02 15:39:12

标签: c++ memory-management

这是对我上一个问题的跟进,

Initializing a class using malloc

关于这个问题的接受的答案是有效的,并且给了我关于avr-gcc的新/删除,这里是问题,但是我的重载新删除对常规gcc造成严重破坏,重载新删除所有我的类派生的正确方法是什么一个共同的基类,所以理想情况下我想覆盖我的对象的新删除,所以它不会混乱stl stdlib等。

2 个答案:

答案 0 :(得分:8)

'new'和'delete'可以在公共Object基类中重载。因此,这仅适用于该层次结构。

class Object {
public:
  void* operator new (size_t size);
  void operator delete (void *p);
};

class Derived : public Object {
// uses the above versions of new/delete
};

[注意:这对您来说是一个额外的好处,因为您的所有课程都来自一个普通的Object课程(如您的问题和链接中所述)]

答案 1 :(得分:2)

超载new& delete在你自己的班级里面不是全球性的。
例如:如果您的公共类的名称是YourClass,您可以按如下方式重载它们:

void *YourClass::operator new(size_t size)
{
    void *p;
    cout << "In overloaded new.";
    p =  malloc(size);
    if(!p) 
    {
        throw std::bad_alloc;  //Throw directly than with named temp variable
    }
    return p;
}

void YourClass::operator delete(void *p)
{
    cout << "In overloaded delete.\n";
    free(p);
}

void *YourClass::operator new[](size_t size)
{
    void *p;
    cout << "Using overload new[].\n";
    p =  malloc(size);
    if(!p) 
    {
        throw std::bad_alloc;
    }
    return p;
}

void YourClass::operator delete[](void *p)
{
    cout << "Free array using overloaded delete[]\n";
    free(p);
}

YourClass派生的所有类都可以使用这些重载的newdelete运算符。