В предыдущих программах я использовал следующий код для проверки ошибок выделения памяти, обычно не думая об альтернативах:
int* p_int = new int[10];
if(!p_int)
{
// We failed, so exit
return EXIT_FAILURE;
}
Этот метод также задокументирован Вот.
я нашел Вот ссылка на синтаксис:
p_int = (nothrow) new int[10];
Что говорит о том, что если программист не включает nothrow
«аргумент» для нового, то проверка на nullptr
является недействительным? Это правильно? Или это зависит от ОС?
Насколько я понимаю, мало смысла ставить new
в try-catch
блок, если вы не можете на самом деле восстановить его из-за накладных расходов, связанных с этим. Это тоже правильно?
Проверка на nullptr
после new
бесполезен, потому что неудачный new
не устанавливает указатель на nullptr
int* p_int = new int[10];
if(!p_int)
{
// error handling
}
Скорее провалился new
будут throw
std::bad_alloc
, так что если вы хотите попытаться справиться с этим, вам нужно try
а также catch
try
{
int* p_int = new int[10];
}
catch (const std::bad_alloc& e)
{
std::cout << "Allocation failed: " << e.what();
// deal with it
}
Да, если только не была использована новая версия без броска (и она не была перегружена, чтобы делать что-то еще!), Она никогда не вернет ноль, а вместо этого выдаст исключение.
А что касается вездесущей проверки на нулевое значение при работе с указателями, это обычно ошибочная вещь. Самое большее, это должно быть ограничено отладочными сборками. Так как нулевые указатели являются лишь узким подклассом в общем плохих (неотменяемых) указателей, и они редко появляются в сборках без отладки, проверка на нулевые значения — это просто прогрев процессора. Например, библиотечные функции обычно не проверяют свои входные данные на наличие нулей.