4

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

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 字节”崩溃。

EG 我输入 n = 536*(10^6) --> bad-alloc exception 我输入 n = 537*(10^6) --> Invalid Allocation Size: 4294967295 Bytes --> 崩溃

任何想法为什么会发生这种情况?

4

3 回答 3

12

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

但是,这不可能在这里发生:nand的乘积sizeof(double)太大以至于实际上根本无法调用operator new,因为您要求的尺寸只是 plain 不适合size_t. 实现在处理这个问题的方式上有所不同,但你的显然中止了程序。

如果你想处理这个,你可以n <= SIZE_MAX / sizeof(double)在尝试分配之前检查一下。

于 2014-05-05T10:26:32.170 回答
4

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

转到项目属性 -> 链接器 -> 系统 -> 启用大型地址设置为“是(/LARGEADDRESSAWARE)

于 2014-05-05T10:26:21.403 回答
0

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

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

于 2014-05-05T10:26:55.860 回答