我编写了以下代码来为数组分配内存:
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;碰撞
为什么会发生这种情况?
答案 0 :(得分:12)
调用new double[n]
调用大小为operator new
的全局n * sizeof(double)
函数。如果operator new
然后发现它无法满足请求,则会抛出异常。
但是,这不可能发生:n
和sizeof(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)
字节,这显然不止于此。