Answers:
您可能在这里只是堆栈溢出。数组太大,无法放入程序的堆栈地址空间。
如果您在堆上分配数组,则应假定计算机有足够的内存,这应该没问题。
int* array = new int[1000000];
但是请记住,这将需要您进入delete[]
阵列。更好的解决方案是使用std::vector<int>
它并将其大小调整为1000000个元素。
在C或C ++中,通常将本地对象分配在堆栈上。您在堆栈上分配了一个大数组,超出了堆栈的处理能力,因此您得到了一个 stackoverflow。
不要在堆栈上本地分配它,而是使用其他位置。这可以通过使对象成为全局对象或在全局堆上分配它来实现。如果不使用任何其他编译单元的,则全局变量很好。为确保这不会偶然发生,请添加静态存储说明符,否则只需使用堆即可。
这将在BSS段中分配,该段是堆的一部分:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
这将在DATA段中分配,它也是堆的一部分:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
这将分配在堆中某个未指定的位置:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
delete
您分配的每个地方来说,这都是一个好习惯new
。但是,如果您确定只分配一次内存(就像在main中一样),则绝对不需要-内存即使在没有exit的情况下也可以在main的出口处释放delete
。
另外,如果您在大多数UNIX&Linux系统上运行,则可以通过以下命令临时增加堆栈大小:
ulimit -s unlimited
但是要小心,内存是有限的资源,强大的功能会带来很大的责任:)