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

时间:2014-05-05 10:14:56

标签: 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)的大数字时,我没有得到一个错误的分配异常,而是一个&#34;无效的分配大小:4294967295字节&#34;崩溃。

E.G。我输入n = 536 *(10 ^ 6) - > bad-alloc异常 我输入n = 537 *(10 ^ 6) - >无效的分配大小:4294967295字节 - &gt;碰撞

为什么会发生这种情况?

3 个答案:

答案 0 :(得分:12)

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

但是,这不可能发生:nsizeof(double)的产品太大,实际上根本无法调用operator new,因为您要求的大小只是普通的不适合size_t。实现方式因执行方式而异,但您的程序显然会中止。

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

答案 1 :(得分:4)

如果您使用Visual Studio进行构建,则可能需要启用&#34;大内存分配&#34;在链接器设置中。

转到项目属性 - &gt;链接器 - &gt;系统 - &gt;启用大地址设置为&#34; 是(/ LARGEADDRESSAWARE)&#34;

答案 2 :(得分:0)

在32位系统上,您的虚拟内存地址空间不能超过2 ^ 31-1(4294967295)字节。

您正在尝试分配536000000*sizeof(double)字节,这显然不止于此。

相关问题