为什么我得到"无效分配大小:4294967295字节"而不是std :: bad_alloc异常?

Sta*_*ter 4 c++ arrays memory-management bad-alloc

我编写了以下代码来为数组分配内存:

try {
    int n = 0;
    cin >> n;
    double *temp = new double[n];
    ...
}
catch(exception& e) {
    cout << "Standard exception: " << e.what() << endl;
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

当然我正在检查n是否为负值等但是当我输入一些超过536*(10 ^ 6)的大数字时,我没有得到一个错误的alloc异常但是"无效的分配大小:4294967295字节"崩溃.

EG我输入n = 536*(10 ^ 6) - > bad-alloc异常我输入n = 537*(10 ^ 6) - >无效分配大小:4294967295字节 - >崩溃

任何想法为什么会这样?

小智 12

调用new double[n]调用operator new大小为的全局函数n * sizeof(double).如果operator new然后发现它无法满足请求,则会抛出异常.

但是,不能在这里发生:的产品nsizeof(double)是如此之大,这实际上是不可能的调用operator new可言,因为你要求的只是普通的大小不会在一个合适的size_t.实现方式因处理方式不同而有所不同,但您的程序显然会中止.

如果要处理此问题,可以n <= SIZE_MAX / sizeof(double)在尝试分配之前进行检查.