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