C++ Nothrow不工作,即使标题正确?(GCC C&x2B;&x2B;)

C++ Nothrow不工作,即使标题正确?(GCC C&x2B;&x2B;),c++,pointers,exception,memory,nothrow,C++,Pointers,Exception,Memory,Nothrow,就我个人而言,我无法解释为什么nothrow不工作。我试过不同的标题。还交换了新标题和内存标题,输出仍然相同: 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不工作。我试过不同的标题。还交换了新标题和内存标题,输出仍然相同:

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 ;
}
#包括
#包括
#包括//也包括/或此
使用名称空间std;
int main()
{
inti,n;
int*p;

我重复这个评论作为回答,因为没有太多补充

新数组的总大小将超过实现定义的最大值,这可能是
std::bad_array_new_length
的原因之一

这个最大值不一定与当前可以分配的内存量有关。它受数组实现可以寻址的长度限制


因此,可能会使用nothrow new、提供指针的placement new或您自己的placement new形式引发异常。

我重复该注释作为答案,因为没有太多要添加的内容

新数组的总大小将超过实现定义的最大值,这可能是
std::bad_array_new_length
的原因之一

这个最大值不一定与当前可以分配的内存量有关。它受数组实现可以寻址的长度限制


因此,异常可能与nothrow new、提供指针的placement new或您自己的placement new形式一起引发。

由于内存不足而未分配内存与由于提供无效参数而未分配内存之间存在差异。
nothrow
用于前者,而不是后者。@PaulMcKenzie好的,这是有道理的。所以我可以相信,如果到时候内存无法分配,循环将运行,我现在在那里的代码将工作?这只是让我感到不安,假设上面的代码可以工作,而不首先测试它。如果参数是有效的,那么抛出的异常是由于内存不足。但是要小心,因为内存不足会使程序变得无助,甚至到了不会抛出内存异常的程度(您的程序只是崩溃或挂起)。希望环境有保留内存,以便在出现内存不足情况时,程序可以继续抛出异常。内存不足导致内存未分配与提供无效参数导致内存未分配之间存在差异。
nothrow
对于前者,而不是后者。@PaulMcKenzie,这是有道理的。因此,我可以相信,如果内存无法分配,循环将运行,我现在在那里的代码将正常工作?这只是让我不安地假设上面的代码可以工作,而不首先测试它。如果参数有效,那么thrown异常是由于内存不足造成的。但是要小心,因为内存不足会使程序无法使用,甚至会导致内存异常没有抛出(您的程序只是崩溃或挂起)。希望环境有保留内存,以便在出现内存不足情况时,程序可以继续抛出异常。