Когда генерируется исключение, стек разматывается (запускаются деструкторы локальных объектов), пока catch
не остановит исключение.Нет ничего, что автоматически устанавливает указатель на NULL
, и это просто так, что один из деструкторов делает это - это будет надуманный пример, который это сделал.
Обычно нет необходимости устанавливать указатель на NULL
.На самом деле, часто вы не можете.Возьмем следующий код:
try {
std::string s("hello, world");
} catch (std::bad_alloc) {
// ???
}
Возможно, что выделение этих 12 байтов завершится неудачно.Исключение вернется из конструктора std::string
.В этот момент объект s
больше не существует, а указатель s._SomeInternalName
внутри s
отсутствует.Поэтому компилятор сообщит об ошибке, если вы попытаетесь использовать s
в блоке catch.И если указатель больше не существует, вы, очевидно, не можете установить его на 0.