Бьерн Страуструп - Абстракция данных в языке С++ - Управление памятью
ОГЛАВЛЕНИЕ
Управление памятью
В С++ три класса памяти : статический, автоматический (стека)
и свободный (динамический). Управление свободной памятью
доступно программисту посредством операций n e w и d e l e t e
Стандартный сборщик мусора не предусмотрен (*2).
Для упрятывания деталей управления свободной памятью очень
удобны конструкторы. Например :
class string {
char *rep;
string (char *);
-
~string() { delete rep; }
. . .
};
string :: string(char *p)
{
rep = new char[strlen(p) + 1];
strcpy(rep, p);
}
Здесь использование свободной памяти внедрено в конструктор
s t r i n g ( ) и его дополнение - деструктор ~ s t r i n g ( ).
Деструкторы неявно вызываются, когда объект покидает область
видимости. Они также вызываются, когда объект явно уничтожается
посредством d e l e t e . Для статических объектов деструкторы
вызываются после всех частей программы при завершении.
________________________________________________________
(*1) - В оригинале - inline, inline function. - прим. переводчика.
(*2) - Нетрудно, однако, написать реализацию операции n e w со
сборкой мусора так, как это было сделано для функции выделения
свободной памяти allocate в старом С. В общем случае
невозможно, просматривая память выполняемой С-программы, отличить
указатели от других элементов данных, поэтому сборщик мусора
должен быть консервативен в выборе того, что подлежит удалению,и
он должен исследовать чрезвычайно большое количество данных.
Впрочем, это может быть полезно для некоторых приложений.
Операция n e w , которой в качестве аргумента передается тип,
возвращает указатель на объект этого типа; d e l e t e
принимает такой указатель в качестве аргумента.
Сам тип s t r i n g может быть размещен в свободной памяти.
Например:
string *p = new string("asdf");
delete p;
p = new string("qwerty");
Более того, классу предоставляется возможность управлять
выделением свободной памяти для своих объектов. Например:
class node {
int type;
node *1;
node *r;
node () { if (this == 0) this =_node (); }
-
~node () { free_node (this); this = 0; }
. . .
};
Для объектов, создаваемых операцией n e w , указатель t h i s
при входе в конструктор будет равен нулю. Если конструктор
не присвоит значение указателю t h i s , будет
использована стандартная функция распределения памяти.
Стандартная функция возврата памяти будет использована в конце
деструктора тогда и только тогда, когда указатель t h i s не
равен нулю. Распределитель памяти, представляемый программистом
для определенного класса или множества классов, может быть много
проще и, по крайней мере, на порядок быстрее стандартного.
Используя конструкторы и деструкторы, проектировщик может
определять такие типы данных, как вышеприведенный s t r i n g ,
у которых размер представления типа может быть переменным, в то
время как размер любой статической и автоматической переменной
должен быть известен при компоновке и компиляции соответственно.
Объект данного класса сам по себе имеет фиксированный размер, но
его класс поддерживает вторичную структуру данных переменного размера.