    Обратите внимание, что указатели на объекты не удаляются автоматически. 
Если вы создаете динамический объект, вы сами ответственны за его удаление 
перед возбуждением исключительной ситуации: 

    int AnyFunction()
    { 
      AnyClass *p = new AnyClass(123);
      // ... 
      if (condition) {
        delete p;	//  Вы ОБЯЗАНЫ удалить в этом месте р 
        throw Error();      // Немедленно завершить функцию AnyFunction 
      } 
      delete p;	// Не выполняется, если условие condition истинно 
      return 123;	// Нормальное возвращение. Не выполняется, если 
                                    // возбуждалась исключительная ситуация
    } 

    Избежать дублирования операторов delete можно только тогда, когда 
исключительная ситуация возбуждается после уничтожения динамического объекта: 

    int AnyFunction() 
    { 
      AnyClass *p = new AnyClass{123); 
      // ... 
      delete p; 
      if (condition) throw Error(); 
      return 123; 
    }

    Используйте флаг, подобный condition, чтобы указать наличие ошибок, 
удалить все динамически выделенные объекты, а затем возбудить исключительную ситуацию. 

    Исключительные ситуации и конструкторы 

    Конструкторы класса могут возбуждать исключительные ситуации для 
сигнализации о том, что они не могут создать объект. До сих пор в C++ не было 
другой возможности сообщить о неудавшемся создании объекта класса, кроме 
обращения к функции-члену, возвращающей истину или ложь в зависимости от того, 
удалось создать объект или нет. 
    Для возбуждения исключительной ситуации из конструктора следует 
использовать ключевое слово throw, как это было продемонстрировано в других примерах: 

    class AnyClass { 
    public: 
      AnyClass()
         { if (condition) throw Error(); } 
     ~AnyClass() { } 
   }; 

    Ключевая концепция здесь заключается в том, что если конструктор 
возбуждает исключительную ситуацию, что означает ненормальное завершение 
конструктора, деструктор этого объекта нe вызывается. Только полностью 
сконструированные объекты уничтожаются с помощью деструкторов — факт, имеющий 
особенно важные последствия для классов, содержащих объекты других классов. 
Рассмотрим следующий случай: 

    class AnyClass { 
       OtherClass x; 
    public: 
       AnyClass(): x(123) 
          { if (condition) throw ErrorO;   } 
          ~AnyClass() { } 
    }; 

    Объект х типа OtherClass создается конструктором AnyClass до того, как 
будут выполняться операторы в теле конструктора. Если конструктор OtherClass 
возбуждает исключительную ситуацию, прочие операторы конструктора не 
выполняются. Поскольку код конструктора не выполнился, объект класса AnyClass 
не создается, и, следовательно, деструктор AnyClass не вызывается. Тот же 
механизм действует и в случае классов, обладающих несколькими объектами: 

    class AnyClass { 
      OtherClass a, b, с; 
    public: 
      AnyClass: a(), b(). c() { } 
      ~AnyClassO { } 
    }; 


    416     Часть III. Программирование на ANSI C++ 
