【发布时间】:2013-07-30 22:28:56
【问题描述】:
我正在运行此代码,在 64 位 vc++ 2005 上编译,在 32GB 的 Windows Server 2008 R2 上。 for 循环内部存在访问冲突。
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
double *x = new double[536870912];
cout << "memory allocated" << endl;
for(long int i = 0; i < 536870912; i++)
{
cout << i << endl;
x[i] = 0;
}
delete [] x;
return 0;
}
如果 new double[536870912] 中没有异常,为什么在对特定数组位置进行赋值时会出现访问冲突?
还有一点值得一提的是,这个程序在另一台电脑上测试成功。
【问题讨论】:
-
一个问题是(我认为)
long int在 64 位 Windows 上是 32 位,所以循环永远不会终止。您应该将i的类型更改为size_t,以确保它对于任何数组索引都足够大。不过,我不知道这是否是唯一的问题。 -
电脑内存足够,不代表可以在里面找到一个空闲的
4GB连续块。 -
@MikeSeymour 即便如此,即使是 32 位整数,5 亿多一点也不成问题。
-
536870912 * sizeof(double)为我产生 0。看起来像operator new内部的环绕。 -
@KirkBackus new 不会返回 null 除非使用这里不是这种情况的 nothrow 版本?
标签: c++ memory windows-server-2008-r2 access-violation