Перегрузка операторов new и delete


Для перегрузки new следует использовать прототип функции вида: void * operator new(size_t size); В дальнейшем обращение к оператору new для выделения памяти объектам класса будут перенаправлены замещающей функции. Функция должна возвращать адрес памяти, выделенной объекту. Вместо кучи можно выделять память из статического буфера, на диске или другом запоминающем устройстве.

// Программа 6

#include <iostream.h>

class DemoNew {

private:

int x;

public:

DemoNew();

void * operator new(size_t size);

};

char buf[512];

int index;

void main()

{

cout << endl << "Creating local instance";

DemoNew b1;

cout << endl << "Allocating space via new";

DemoNew *b2 = new DemoNew;

DemoNew *b3 = new DemoNew;

DemoNew *b4 = new DemoNew;

DemoNew *b5 = new DemoNew;

}

DemoNew::DemoNew()

{

cout << endl << "Inside constructor";

x = index;

}

void *DemoNew::operator new(size_t size)

{

cout << endl << "Inside overloaded new. Size == "<< size;

if ( index >=512 — sizeof(DemoNew)) //Проверка наличия

return 0; //пространства в buf

else {

int k = index;

index+= sizeof(DemoNew);

return &buf[k];

}

}

Оператор delete служит для удаления объектов, адресован-ных указателями. Прототип функции перегрузки оператора delete должен иметь вид: void operator delete(void *p); , где р ссылается на удаляемый объект.

void operator delete(void *p);

void DemoNew::operator delete(void *p)

{

cout << endl << "Deleting object at "<< p;

}

Поскольку объекты не запоминаются в куче, то перегру-женный оператор ничего не освобождает.

Загрузка...