Исключения. Высвобождение объектов в исключениях
В этой статье описывается, что и метод освобождение объектов при возникновении исключения. Ниже приведен список разделов.
Обработка исключения локально
При порождении исключения после уничтожения объектов
Исключения, создаваемые средой выполнения или приложением прерывают программную нормальную последовательность. Таким образом, важно сохранить точное отслеживание объектов, чтобы правильно 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 могут создавать исключения.
Дополнительные сведения см. в разделе Исключения: Улавливающ и удаление исключения.