Устанавливает ли новый указатель на NULL, если он выбрасывает std :: bad_alloc?
-
27-10-2019 - |
Вопрос
Я знаю, что создание кода new(std::no_throw)
установит указатель на код NULL
в случае сбоя.
Я также знаю, что нормальный new
вызовет исключение std::bad_alloc
в случае сбоя.
Будет ли обычный new
также устанавливать указатель на NULL
, если он генерирует код?Или мне следует установить его на NULL
в блоке catch()
?
Решение
В C ++ неправильный код new
вызовет исключение (если вы не используете std :: nothrow), и указатель не будет назначен, поэтому он будет таким, каким он был до вызова new
.
Однако вас может заинтересовать эта статья , в котором говорится о принуждении new
возвращать значение null при ошибке, как вы упомянули в своем вопросе.
Другие советы
Когда генерируется исключение, стек разворачивается (запускаются деструкторы локальных объектов) до тех пор, пока генеральный кодовый код не остановит исключение.Нет ничего, что автоматически устанавливает указатель на catch
, и совершенно неожиданно, что это делает один из деструкторов - это был бы надуманный пример, который это сделал.
Обычно нет необходимости устанавливать указатель на NULL
.Фактически, часто вы не можете.Возьмите следующий код:
Возможно, что выделить эти 12 байтов не удастся.Исключение будет возвращено конструктором NULL
.В этот момент объект std::string
больше не существует, и указатель не генерирует код кода внутри s
.Поэтому компилятор сообщит об ошибке, если вы попытаетесь использовать код s._SomeInternalName
в блоке catch.И если указатель больше не существует, вы, очевидно, не можете установить его на 0.