Язык программирования C++ от Страуструпа


Удаление


Пользовательские типы чаще имеют, чем не имеют, конструкторы, которые проводят надлежащую инициализацию. Для многих типов требуется и обратная операция - деструктор, гарантирующая правильное удаление объектов этого типа. Деструктор класса X обозначается ~X ("дополнение конструктора"). В частности, для многих классов используется свободная память (см. $$3.2.6), выделяемая конструктором и освобождаемая деструктором. Вот, например, традиционное определение типа стек, из которого для краткости полностью выброшена обработка ошибок:

class char_stack {

  int size;

  char* top;

  char* s;

  public:

     char_stack(int sz) { top=s=new char[size=sz]; }

     ~char_stack()  { delete[] s; }  // деструктор

     void push(char c) { *top++ = c; }

     void pop()   { return *--top; }

};

Когда объект типа char_stack выходит из текущей области видимости, вызывается деструктор:

void f()

{

  char_stack s1(100);

  char_stack s2(200);

  s1.push('a');

  s2.push(s1.pop());

  char ch = s2.pop();

  cout << ch << '\n';

}

Когда начинает выполняться f(), вызывается конструктор char_stack, который размещает массив из 100 символов s1 и массив из 200 символов s2. При возврате из f() память, которая была занята обоими массивами, будет освобождена.



Содержание раздела