Новый указатель устанавливает в NULL, если он бросает std :: bad_alloc? - PullRequest
2 голосов
/ 30 января 2011

Я знаю, что выполнение new(std::no_throw) установит указатель на NULL в случае неудачи.Я также знаю, что нормальный new сгенерирует исключение std::bad_alloc в случае сбоя.

Будет ли нормальный new также устанавливать указатель на NULL, если он выбрасывает?Или я должен установить его на NULL в блоке catch()?

Ответы [ 2 ]

6 голосов
/ 30 января 2011

В C ++ плохой new вызовет исключение (если вы не используете std :: nothrow), и указатель не будет назначен, поэтому он будет таким, каким он был до вызова new.

Однако, вас может заинтересовать эта статья , в которой говорится о принуждении new к возврату null при ошибке, как вы упомянули в своем вопросе.

0 голосов
/ 31 января 2011

Когда генерируется исключение, стек разматывается (запускаются деструкторы локальных объектов), пока catch не остановит исключение.Нет ничего, что автоматически устанавливает указатель на NULL, и это просто так, что один из деструкторов делает это - это будет надуманный пример, который это сделал.

Обычно нет необходимости устанавливать указатель на NULL.На самом деле, часто вы не можете.Возьмем следующий код:

try { 
  std::string s("hello, world");
} catch (std::bad_alloc) {
 // ???
}

Возможно, что выделение этих 12 байтов завершится неудачно.Исключение вернется из конструктора std::string.В этот момент объект s больше не существует, а указатель s._SomeInternalName внутри s отсутствует.Поэтому компилятор сообщит об ошибке, если вы попытаетесь использовать s в блоке catch.И если указатель больше не существует, вы, очевидно, не можете установить его на 0.

...