Nothrow не работает, даже с правильным заголовком? (G CC C ++) - PullRequest
1 голос
/ 26 апреля 2020

За свою жизнь я не могу понять, почему не работает. Я пробовал разные заголовки. Также поменялись местами новые и заголовки памяти и все тот же вывод:

0x61ff50    6422400
How many numbers would you like to type: 1000000000

terminate called after throwing an instance of 'std::bad_array_new_length'
  what():  std::bad_array_new_length

Есть идеи, что я делаю не так? Я ищу способ дать nothrow без сбоя программы и использовать произвольное значение для размера массива. Кажется, мне нужно использовать массив в пределах максимального размера, что обеспечит стабильность программы, и, следовательно, я не могу протестировать объект nothrow; оставив мне единственный вариант использования исключения.

#include <iostream>
#include <memory> 
#include <new>    // also either/or this 


using namespace std ;

int main ()
{
    int i, n ;

    int *p ;

    cout << p << "    " << *p << endl ;


    cout << "How many numbers would you like to type: " ;

    cin >> i ;


    p = new (nothrow) int[i] ;

    if (!p)
    {
        cout << "Error: memory could not be allocated" ;
    }

    else
    {
        for (n = 0 ; n < i ; n ++)
        {
            cout << "Enter number: " ;

            cin >> p[n] ;
        }
        cout << endl << p << endl << *p << endl ;
        cout << "You have entered: " ;

        for (n = 0 ; n < i ; n++ )
            cout << p[n] << ", " ;


        delete[] p ;

        cout << endl << p << "   " << *(p + 0) << endl ;

        p = nullptr ;

        cout << endl << p << endl ;

        p = &i ;

        cout << endl << p << "    " << *p ;

    }

    cin.get() ;

    return 0 ;
}

1 Ответ

0 голосов
/ 26 апреля 2020

Я повторяю комментарий как ответ, так как добавить особо нечего.

Общий размер нового массива превысил бы максимальное значение, определяемое реализацией - одна из возможных причин для std::bad_array_new_length.

Это максимальное значение не обязательно связано с объемом памяти, который может быть выделен в данный момент. Ограничено длиной массива, к которому может обратиться реализация.

Таким образом, исключение может быть выдано с помощью nothrow new, размещение нового с указанным указателем или ваша собственная форма размещения new.

...