c++ - 为什么我得到 "Invalid Allocation Size: 4294967295 Bytes"而不是 std::bad_alloc 异常?

标签 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);
}

当然,我正在检查 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/

相关文章:

c++ - 有unique_from_this()吗?或者如何从继承自 enable_shared_from_this 的类返回 unique_ptr

android - 减少我的应用程序分配的堆

c++ - 使用模板元编程的位交换功能

java - 多重 map 中最近距离的两次

python - Numpy 追加到一个空数组

C将结构中的数组和指针初始化为相同的值

c++ - 命名空间中的函数模板特化

c++ - C++ 中的 DevIL 和 OpenGL

c++ - 什么是 (double (^)(int))foofoo

java - Java中如何释放内存?