Устанавливает ли новый указатель на NULL, если он выбрасывает std :: bad_alloc?

StackOverflow https://stackoverflow.com/questions/4845192

Вопрос

Я знаю, что создание кода 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top