Как узнать возвращаемое значение, если мой 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;