Бьерн Страуструп - Язык программирования С++. Главы 5-8
Страница 22. Свободная память



5.5.3 Свободная память

 Рассмотрим пример:

          main()
          {
             table* p = new table(100);
             table* q = new table(200);
             delete p;
             delete p;  // вероятно, вызовет ошибку при выполнении
           }

 Конструктор table::table() будет вызываться дважды, как и деструктор
 table::~table(). Но это ничего не значит, т.к. в С++ не
 гарантируется, что деструктор будет вызываться только для объекта,
 созданного операцией new. В этом примере q не уничтожается вообще,
 зато p уничтожается дважды! В зависимости от типа p и q программист
 может считать или не считать это ошибкой. То, что объект не
 удаляется, обычно бывает не ошибкой, а просто потерей памяти. В то же
 время повторное удаление p - серьезная ошибка. Повторное применение
 delete к тому же самому указателю может привести к бесконечному
 циклу в подпрограмме, управляющей свободной памятью. Но в языке
 результат повторного удаления не определен, и он зависит от
 реализации.
     Пользователь может определить свою реализацию операций new и
 delete (см. $$3.2.6 и $$6.7). Кроме того, можно установить
 взаимодействие конструктора или деструктора с операциями new и
 delete (см. $$5.5.6 и $$6.7.2). Размещение массивов в свободной
 памяти обсуждается в $$5.5.5.

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