new(std::nothrow) int[n] выдает исключение
#include <iostream>
#include <new>
int main()
{
int n = -1;
try
{
int *p = new(std::nothrow) int[n];
if(!p)
std::cout << "new expression returned nullptr\n";
}
catch(const std::bad_array_new_length& e)
{
std::cout << "new expression threw " << e.what() << std::endl;
}
}
Почему этот код вызывает исключение? Он печатаетnew expression threw std::bad_array_new_length
. Согласно стандарту новое выражение в этом случае должно возвращать nullptr.
Если выражение в noptr-new-declarator присутствует, оно неявно преобразуется в std::size_t. Выражение ошибочно, если:
- выражение неклассового типа и его значение перед преобразованием в std:: size_t меньше нуля;
[...]
Если выражение ошибочно после преобразования в std::size_t:
- если выражение является основным постоянным выражением, программа имеет неправильный формат;
- в противном случае функция распределения не вызывается; вместо
- если функция распределения, которая должна была бы быть вызвана, имеет спецификацию исключения исключения (14.5), значение нового-выражения является значением нулевого указателя требуемого типа результата;
- в противном случае новое-выражение завершается выдачей исключения типа, который соответствует обработчику (14.4) типа std::bad_array_new_length (17.6.3.2).
Скомпилировано с помощью gcc 9.2
1 ответ
Я подозреваю, что это ошибка libstdC++; запуск этого кода с использованием clang и libC++ выводит "новое выражение вернуло nullptr"