Исключения: Освобождение объектов в исключении

В этой статье описывается необходимости и освобождение объектов, когда возникает исключение.Ниже приведен список разделов.

  • Обработка исключения локально

  • Генерация исключений после разрушать объекты

Исключения, вызываемые структурой или приложением прерывают нормальную последовательность разработки.Таким образом, очень важно обеспечить близкую отслеживание объектов, чтобы можно было правильно удалить их в случае, если исключение.

2 Основных метода для этого.

  • Обработка исключений локально с помощью ключевых слов try и catch, затем разрушают все объекты с одной выпиской.

  • Destroy любой объект в блоке catch до создания исключения вне блока для дополнительной обработки.

Эти 2 подхода проиллюстрированы ниже, как решения проблемному к следующему примеру:

void SomeFunc()        // Problematic code
{
   CPerson* myPerson = new CPerson;

   // Do something that might throw an exception.
   myPerson->SomeFunc();

   // Now destroy the object before exiting.
   // If SomeFunc above throws an exception this code will
   // not be reached and myPerson will not be deleted.
   delete myPerson;
}

Как написано выше myPerson не будет удалено. если исключение возникает SomeFunc.Выполнение скачет непосредственно к следующему внешнему обработчику исключений, обход оставить обычной функции и код, который удаляет объект.Указатель на объект выходит из области, когда исключение покидает функция и память, занимаемая объектом никогда не будет восстановлена до тех пор, пока программа выполняется.Это утечка памяти; оно будет обнаружен с помощью диагностики памяти.

Обработка исключения локально

Парадигма try/catch предоставляет метод для защитительный программирования во избежание утечки памяти и защита, что объекты уничтожаются при возникновении исключений.На примере, пример, приведенный ранее в этой статье может быть переписан следующим образом:

void SomeFunc()
{
   CPerson* myPerson = new CPerson;

   try
   {
      // Do something that might throw an exception.
      myPerson->SomeFunc();
   }
   catch( CException* e )
   {
      // Handle the exception locally
      e->Delete();
   }

   // Now destroy the object before exiting.
   delete myPerson;
}

Этот новый пример настраивает обработчик исключений для перехвата исключения и обрабатывать их локально.Затем функция " в обычном режиме и удаляет объект.Важным аспектом этого примера, что контекст для перехвата исключения устанавливается с блоками try/catch.Без локального кадра исключения, функция никогда не возникло бы знала, что и не будет иметь возможность выйти и исключение обычно разрушать объект.

Генерация исключений после разрушать объекты

Другой способ обработки исключений передать их к следующему внешний контекст обработки ошибок.В блоке catch можно выполнить определенную очистку ваших локально выбранных объектов, а затем вызвать исключение on для дальнейшей обработки.

Создание функция может вернуть или не освобождает объекты в куче.Если функции отмены выделения кучи всегда объект перед возвратом в обычном случае затем функции также deallocate объекта в куче до создания исключения.С другой стороны, если функция не позволяет нормально deallocate объект перед возвращением в обычном случае необходимо принять решение о том, по свяким случаям качестве основы, должен ли объект кучи быть освобождена.

В следующем примере показано, как локально выбранные объекты можно очистить.

void SomeFunc()
{
   CPerson* myPerson = new CPerson;

   try
   {
      // Do something that might throw an exception.
      myPerson->SomeFunc();
   }
   catch( CException* e )
   {
      e->ReportError();
       // Destroy the object before passing exception on.
      delete myPerson;
      // Throw the exception to the next handler.
      throw;
   }

   // On normal exits, destroy the object.
   delete myPerson;
}

Исключения механизма объекты кадра отмены выделения памяти автоматически. деструктор объекта фрейма также вызывается.

При вызове функций, которые могут генерировать исключения можно использовать блоки try/catch чтобы убедиться, что перехватывать исключения и имеется возможность удалить все объекты были созданы.В частности, следует учитывать, что многие функции MFC могут генерировать исключения.

Дополнительные сведения см. в разделе исключения: Улавливающ и удаление исключения.

См. также

Основные понятия

Обработка ошибок в MFC