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

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

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

Если производный класс осуществляет присваивание указтелю this, то конструктор его базового класса будет вызыватся только после этого присваивания, и значение указателя this в конструкторе базового класса будет тем, которое присвоено конструктором производного класса. Если базовый класс присвивает указателю this, то будет присвоено то значение, которое использует конструктор производного класса. Например:

#include «stream.h»

struct base (* base(); *);

struct derived : base (* derived(); *)

base::base() (* cout «„ „ base 1: this=“ „„ int(this) «« « “; if (this == 0) this = (base*)27; cout «« « base 2: this=“ «« int(this) «« « “; *)

derived::derived() (* cout «„ „ derived 1: this=“ „„ int(this) «« « “; this = (this == 0) ? (derived*)43 : this; cout «« « derived 2: this=“ «« int(this) «« « “; *)

main() (* cout «„ „base b; “; base b; cout „„ „new base b; “; new base; cout «« «derived d; “; derived d; cout «« «new derived d; “; new derived; cout «« «at the end “;

*)

порождает вывод

base b; base 1: this=2147478307 base 2: this=2147478307 new base; base 1: this=0 base 2: this=27 derived d; derived 1: this=2147478306 base 1: this=2147478306 base 2: this=2147478306 derived 1: this=2147478306 new derived; derived 1: this=0 base 1: this=43 base 2: this=43 derived 1: this=43 at the end

Если деструктор производного класса осуществляет присвивание указателю this, то будет присвоено то значение, котрое встретил деструктор его базового класса. Когда кто-либо делает в конструкторе присваивание указателю this, важно, чтобы присваивание указателю this встречалось на всех путях в конструкторе*.

– * К сожалению, об этом присваивании легко забыть. Напрмер, в первом издании этой книги (английском – перев.) вторая строка конструктор derived::derived() читалась так:

if (this == 0) this = (derived*)43;

И следовательно, для d конструктор базового класса base::base() не вызывался. Программа была допустимой и коректно выполнялась, но, очевидно, делала не то, что подразмевал автор. (прим. автора)

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

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

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

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. Память Когда вы читаете эту книгу, идете по переполненной улице, слушаете симфонию, успокаиваете плачущего ребенка, ваш мозг набит пространственными и временными паттернами от всех ваших органов чувств. Мир это океан постоянно меняющихся паттернов, которые приходят,