R.12.5 Свободная память

R.12.5 Свободная память

Когда создается объект с помощью операции new, для получения свободной памяти вызывается (неявно) функция operator new() (§R.5.3.3).

Если функция operator new() не может выполнить запрос, она возвращает 0.

В классе X функция X::operator new() является статическим членом, даже если она не описана явно как static. Первый ее параметр должен иметь тип size_t, - зависящий от реализации целочисленный тип, который определен в стандартном заголовочном файле ‹stddef.h›, и она должна возвращать значение типа void*, например:

class X {

 //…

 void* operator new(size_t);

 void* operator new(size_t, Arena*);

};

Правила выбора подходящей функции operator new() обсуждаются в §R.5.3.3.

В классе X функция X::operator delete() является статическим членом, даже если она не описана явно как static. Первый ее параметр должен быть типа void* и можно добавлять второй параметр типа size_t. Она не может возвращать какое-либо значение и тип возвращаемого значения должен быть void, например:

class X {

 //…

 void operator delete(void*);

};

class Y {

 //…

 void operator delete(void*, size_t);

};

В каждом классе можно описать только одну функцию operator delete(), значит эта функция не может быть перегруженной. Глобальная функция operator delete() имеет единственный параметр типа void*.

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

Для массивов объектов типа класс используются глобальные функции operator new() и operator delete() (§R.5.3.3, §R.5.3.4).

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

struct B {

 virtual ~B();

 void* operator new(size_t);

 void operator delete(void*);

};

struct D: B {

 ~D();

 void* operator new(size_t);

 void operator delete(void*);

};

void f()

{

 B* p = new D;

 delete p;

}

В этом примере память для объекта класса D выделяется с помощью D::operator new(), а благодаря наличию виртуального деструктора, освобождается с помощью D::operator delete().

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

3.4. Свободная и несвободная модели коммерческого ПО

Из книги автора

3.4. Свободная и несвободная модели коммерческого ПО После того, как программы были признаны объектом авторского права (в том числе, исключительных имущественных прав) – в семидесятых-девяностых гг. XX в. (в разных странах) – в профессии и отрасли оформились два подхода к


Свободная орбита

Из книги автора

Свободная орбита Команда 3DFORBIT активизирует управление интерактивным просмотром объектов в трехмерном режиме, используя неограниченную орбиту, обеспечивающую движение по кругу в любом направлении без привязки к плоскости. При этом точка зрения не ограничена


Свободная орбита

Из книги автора

Свободная орбита Команда 3DFORBIT активизирует управление интерактивным просмотром объектов в трехмерном режиме, используя неограниченную орбиту, обеспечивающую движение по кругу в любом направлении без привязки к плоскости. При этом точка зрения не ограничена


Память

Из книги автора

Память HeapSize Функция HeapSize возвращает размер блока памяти, выделенного из кучи функциями HeapAlloc или HeapReAlloc , в байтах. DWORD HeapSize ( HANDLE hHeap , // дескориптор кучи DWORD dwFlags , // контрольные флаги размера кучи LPCVOID lpMem // указатель на память, чей размер возвращается ); Параметры hHeap -


Свободная поддержка SQL

Из книги автора

Свободная поддержка SQL По всем вопросам, связанным с SQL Firebird, присоединяйтесь к форуму поддержки Firebird на http://www.yahoogroups.com/community/firebird-support. Это добровольный список адресов электронной почты, где знающие и новые пользователи Firebird делятся своим опытом. Если вы предпочитаете


Свободная орбита

Из книги автора

Свободная орбита Команда 3DFORBIT активизирует управление интерактивным просмотром объектов в трехмерном режиме, используя неограниченную орбиту, обеспечивающую движение по кругу в любом направлении без привязки к плоскости. При этом точка зрения не ограничена


Оперативная память

Из книги автора

Оперативная память Оперативная память (оперативное запоминающее устройство, ОЗУ, «мозги», «оперативка») – микросхемы, используемые процессором для временного хранения данных при выполнении расчетов. В подавляющем большинстве случаев такая память представлена в виде


Свободная орбита

Из книги автора

Свободная орбита Команда 3DFORBIT активизирует управление интерактивным просмотром объектов в трехмерном режиме, используя неограниченную орбиту, обеспечивающую движение по кругу в любом направлении без привязки к плоскости. При этом точка зрения не ограничена


5.5.3 Свободная Память

Из книги автора

5.5.3 Свободная Память Рассмотрим:main() (* table* p = new table(100); table* q = new table(200); delete p; delete p; // возможно, ошибка *)Конструктор table::table() будет вызван дважды, как и деструктор table::~table(). То, что С++ не дает никаких грантий, что для объекта, созданного с помощью new, когда-либо будет вызван


7.7 Свободная Память

Из книги автора

7.7 Свободная Память Если вы пользовались классом slist, вы могли обнаружить, что ваша программа тратит на заметное время на размещение и освобождение объектов класса slink. Класс slink – это превоходный пример класса, который может значительно выиграть от того, что программист


7.2.4 Свободная Память

Из книги автора

7.2.4 Свободная Память Операция new создает объект типа имя_типа (см. #8.7), к которому он применен. Время жизни объекта, созданного с пмощью new, не ограничено областью видимости, в которой он создан. Операция new возвращает указатель на созданный ей объект. Когда объект является


8.5.8 Свободная Память

Из книги автора

8.5.8 Свободная Память Когда с помощью операции new создается классовый объект, то для получения необходимой памяти конструктор будет (неяно) использовать operator new (#7.1). Конструктор может осществить свое собственное резервирование памяти посредством присваивания указателю


Свободная сеть по Джону Макафи: как любопытство АНБ может стать фундаментом нового бизнеса Михаил Ваннах

Из книги автора

Свободная сеть по Джону Макафи: как любопытство АНБ может стать фундаментом нового бизнеса Михаил Ваннах Опубликовано 02 октября 2013 Эдвард Сноуден вряд ли получит Нобелевскую премию мира. Да и судьба разговорчивого идеалиста едва ли сложится


СОФТЕРРА: Память на лица, или Лица на память

Из книги автора

СОФТЕРРА: Память на лица, или Лица на память Автор: Алексей КлимовВышла девятая версия ACDSee. Судя по объему нововведений, это не «Девятый вал» Айвазовского [Иван Айвазовский, «Девятый вал». 1850 г] и даже не «9 рота» Бондарчука [Федор Бондарчук, «9 рота». 2005 г]. Поэтому в обзоре


4. Память

Из книги автора

4. Память Когда вы читаете эту книгу, идете по переполненной улице, слушаете симфонию, успокаиваете плачущего ребенка, ваш мозг набит пространственными и временными паттернами от всех ваших органов чувств. Мир это океан постоянно меняющихся паттернов, которые приходят,