Как узнать возвращаемое значение, если мой C++ "новый" сбой выделения памяти?

В C люди часто проверяют нулевые указатели после использования malloc. Однако в C++ мы будем использовать "новый". Основываясь на моем предыдущем вопросе здесь, я узнаю, что новое в C++ даст два возможных возвращаемых значения при ошибке выделения памяти:

Выбрасывающая версия: ничего не вернуть, программа потерпит крах, если я попытаюсь использовать (чтение / запись) выделенную переменную.

Версия без метания: возвращает указатель NULL.

Как я могу узнать, какую версию использует моя программа? (Есть ли какие-то общие шаги, чтобы искать, так как я бы предпочел не упоминать ОС, которую я использую, чтобы избежать осложнений)

4 ответа

Стандарт указывает на то, что неквалифицированный new будет выбрасывающей версией, хотя некоторые (как правило, встроенные) системы предлагают опции компилятора для изменения поведения по умолчанию.

Если ты видишь new (std::nothrow) T тогда это не-бросающая версия, которая возвращает ноль при неудаче.

Вы знаете, какой из них вы используете, потому что вы решили, какой из них использовать, когда писали свою программу.

new T бросит на провал; new (std::nothrow) T будет оценивать nullptr вместо.

Призвание new без указания параметра бросит std::bad_alloc исключение, если это не удается Если ваш код не перехватывает это исключение, он может завершить работу приложения или, по крайней мере, уничтожить вызывающий поток.

призвание new с std::nothrow возврат параметров NULL/nullptr если не получится. Если ваш код не проверяет это условие, вы столкнетесь с падением при попытке получить доступ к памяти через этот указатель.

Приложение может использовать set_new_handler() указать пользовательский обработчик для обнаружения ошибок выделения перед new выходы. Обычно это используется для регистрации сообщений об ошибках или для очистки памяти, чтобы new можно повторить выделение.

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

new Thing;

в то время как не выбрасывающий новый, который возвращает ноль при неудаче, выглядит как

new(std::nothrow) Thing;
Другие вопросы по тегам