C ++ Распределение памяти с оператором new: Каковы методы обнаружения и обработки ошибок выделения?

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

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 блок, если вы не можете на самом деле восстановить его из-за накладных расходов, связанных с этим. Это тоже правильно?

3

Решение

Проверка на 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
}
3

Другие решения

Да, если только не была использована новая версия без броска (и она не была перегружена, чтобы делать что-то еще!), Она никогда не вернет ноль, а вместо этого выдаст исключение.
А что касается вездесущей проверки на нулевое значение при работе с указателями, это обычно ошибочная вещь. Самое большее, это должно быть ограничено отладочными сборками. Так как нулевые указатели являются лишь узким подклассом в общем плохих (неотменяемых) указателей, и они редко появляются в сборках без отладки, проверка на нулевые значения — это просто прогрев процессора. Например, библиотечные функции обычно не проверяют свои входные данные на наличие нулей.

2

По вопросам рекламы [email protected]