Бьерн Страуструп - Абстракция данных в языке С++
Страница 11. Управление памятью


 

        Управление памятью

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

 
« Предыдущая статья   Следующая статья »