Properly Overloading new/delete new[]/delete[]

2020-03-23 17:10发布

This is a follow up to my previous question,

Initializing a class using malloc

Accepted answer on the question works and gives me new/delete on the avr-gcc, here is the problem but my overloaded new delete wracks havoc on regular gcc, what is the proper way to overload new delete all my classes derive from a common base class so ideally i would like to just override new delete for my object so it does not mess with stl stdlib etc.

2条回答
欢心
2楼-- · 2020-03-23 17:48

Overload the new & delete inside your own class & not Globally.
For eg: If name of your common class is YourClass, You can overload them as follows:

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);
}

All classes derived from YourClass will be able to use these overloaded new and delete operators.

查看更多
爷的心禁止访问
3楼-- · 2020-03-23 18:08

'new' and 'delete' can overloaded inside the common Object base class. So, that will be applicable only to that hierarchy.

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
};

[Note: It's an added advantage for you as all your class are getting derived from a common Object class (as mentioned in your question and the link)]

查看更多
登录 后发表回答