Поделиться через


Исключения. Высвобождение объектов в исключениях

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

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

  • При порождении исключения после уничтожения объектов

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

2 Задачи основных методов это.

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

  • Удалите все объекты в блоке 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, можно выполнить определенную очистку, локально выбранных объектов, а затем создать исключение, для дальнейшей обработки.

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

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

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