Страница 11 из 25 Управление памятью В С++ три класса памяти : статический, автоматический (стека) и свободный (динамический). Управление свободной памятью доступно программисту посредством операций 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 , у которых размер представления типа может быть переменным, в то время как размер любой статической и автоматической переменной должен быть известен при компоновке и компиляции соответственно. Объект данного класса сам по себе имеет фиксированный размер, но его класс поддерживает вторичную структуру данных переменного размера. |