我写了下面一段代码来为一个数组分配内存:
try {
int n = 0;
cin >> n;
double *temp = new double[n];
...
}
catch(exception& e) {
cout << "Standard exception: " << e.what() << endl;
exit(1);
}
当然,我正在检查 n 的负值等。但是当我输入一些超过 536*(10^6) 的大数字时,我没有收到错误分配异常,而是收到“无效分配大小:4294967295 字节”崩溃。
例如我输入 n = 536*(10^6) --> bad-alloc exception 我输入 n = 537*(10^6) --> 分配大小无效:4294967295 字节 --> 崩溃
知道为什么会这样吗?
最佳答案
调用 new double[n]
调用全局 operator new
大小为 n * sizeof(double)
的函数.如果operator new
然后发现它不能满足请求,它抛出一个异常。
然而,这不会发生在这里:n
的产物和 sizeof(double)
太大了,实际上不可能调用operator new
完全没有,因为您要求的尺寸不适合 size_t
.实现方式在处理此问题的方式上有所不同,但您的实现显然会中止该程序。
如果你想处理这个,你可以检查n <= SIZE_MAX / sizeof(double)
在尝试分配之前。
关于c++ - 为什么我得到 "Invalid Allocation Size: 4294967295 Bytes"而不是 std::bad_alloc 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23470003/