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"

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