Overloaded new and delete operator for arrays

Let us try to understand the overloading of new and delete operator for arrays using below example.

#include <iostream>
using namespace std;
void* operator new(size_t sz) {
    cout << "Global Memory Allocation: " << sz << endl;
    void* ptr = malloc(sz);
    return ptr;
}

void operator delete(void* ptr) {
    cout << "Global memory Deallocation" << endl;
    free(ptr);
}

class Memory {
    enum { mem_size = 10 };
    int arr[mem_size];
public:
    Memory() {
        cout << "Memory C'tor" << endl;
    }

~Memory() {
        cout << "Memory D'tor" << endl;
    }

    void* operator new(size_t sz) {
        cout << "Class Memory Allocation: " << sz << endl;
        void * ptr = malloc(sz);
        return ptr;
    }

    void operator delete(void* ptr) {
        cout << "Class Memory Deallocation" << endl;
        free(ptr);
    }

    void* operator new[](size_t sz) {
        cout << "Class Memory Array Allocation: " << sz << endl;
        ::new char[sz];
    }

    void operator delete[](void* ptr) {
        cout << "Class Memory Array Deallocation" << endl;
        ::delete []ptr;
    } };

int main()
{
    Memory* arr = new Memory[10];
    delete []arr;
    return 0;
}

  • In the above example, overloaded array version of new of a class is called.
  • In this example, first the overloaded array version of new of a class is called, then ten times the constructor of Memory class.
  • Let say if the overloaded array version of new for a class is not present, then globally overloaded version of new is called not globally overloaded array version of new. This conclude that we never need globally overloaded array version of new.

Related posts