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

2 ответа

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

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

Другие вопросы по тегам