Hamza Yerlikaya
Hamza Yerlikaya

Reputation: 49339

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

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.

Upvotes: 5

Views: 6000

Answers (2)

iammilind
iammilind

Reputation: 70104

'new' and 'delete' can overloaded inside your common Object base class. This change will apply 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)]

Upvotes: 8

Alok Save
Alok Save

Reputation: 206666

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.

Upvotes: 3

Related Questions