Язык программирования C++



             

Операции new и delete - часть 2


class A { void* operator new(size_t size); };

Аргумент size задает размер необходимой памяти в байтах. size_t – это тип целого, подходящий для установления размера объектов в данной реализации языка, определенный через typedef. Чаще всего это тип long. Аргумент операции new явно при ее вызове не задается. Компилятор сам его подставляет, исходя из размера создаваемого объекта.

Реализация операции new, которая совпадает со стандартной, выглядит просто:

void* A::operator new(size_t size) { return ::new char[size]; }

В классе может быть определено несколько операций new с различными дополнительными аргументами. При вызове new эти аргументы указываются сразу после ключевого слова new в скобках до имени типа. Компилятор добавляет от себя еще один аргумент – размер памяти, и затем вызывает соответствующую операцию. Описанная выше модификация new, помещающая объект по определенному адресу, имеет вид:

void* operator new(void* addr, size_t size);

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

class A { void* operator new(char init, size_t size); }; void* A::operator new(char init, size_t size) { char* result = ::new char[size]; if (result) { for (size_t i = 0; i < size; i++) result[i] = init; } return result; }

Вызов такой операции имеет вид:

A* aptr = new (32) A;

Память под объект класса A будет инициализирована числом 32 (что, кстати, является кодом пробела).

Отметим, что если класс определяет хотя бы одну форму операции new, глобальная операция будет переопределена. Например, если бы в классе A была определена только операция new с инициализацией, то вызов

A* ptr = new A;

привел бы к ошибке компиляции, поскольку подобная форма new в классе не определена. Поэтому, если вы определяете new, определяйте все ее формы, включая стандартную (быть может, просто вызывая глобальную операцию).

В отличие от операции new, для которой можно определить разные модификации в зависимости от числа и типов аргументов, операция delete существует только в единственном варианте:




Содержание  Назад  Вперед