【发布时间】:2011-11-24 09:07:04
【问题描述】:
我最近迁移到了一台新的笔记本电脑 - HP dv6119tx(Intel Core i5,4 GB RAM)。它安装了 Windows 7 Home Premium 64 位。
我正在尝试在 C++(Dev C++)中创建一个长度为 10^6 的 int 类型的数组,我曾经在我的最后一台笔记本电脑(32 位 Windows 7 Ultimate/Ubuntu Linux,2GB RAM)上轻松创建该数组以及我编写的所有其他环境(大约需要 3.5 MB 的 RAM)。但是使用当前设置,我在调试模式下收到“分段错误”错误。
屏幕截图(编辑):
第一个屏幕截图显示 10^5 在当前设置上工作,而 10^6 不在。我的最后一台机器上没有 10^6 的屏幕截图,但我已经用过很多次了。
编辑:
如果我将数组声明为 global 或在堆上动态创建它为
int* a = new int[MAX];
但我无法理解的是,当本地阵列在堆栈上占用微不足道的 3.5 MB 内存时(并且在 2 GB 机器上运行良好),为什么这个问题会出现在 4GB 机器上?这是用户堆栈空间问题吗?可以手动增加吗?
编辑 2:
我特别问这个问题是因为我在 SPOJ 上提交了许多解决方案,在堆栈上创建了 10^6 大小的数组。以我目前的设置,我觉得无法做到这一点是残废的。我更喜欢堆栈而不是堆,因为它没有内存泄漏问题;和全局变量上的局部变量,因为它们很整洁并且不会弄乱命名空间。
【问题讨论】:
-
这是回答这个问题的好地方。
-
@RaymondChen:再数一遍,有六个零。
-
您可以增加堆栈大小,但不能。你只是无缘无故地占用了一堆内存。不要滥用堆栈。将大对象放在堆上。
-
@Raymond 您可以永久删除评论。将光标悬停在评论的最右端(时间之后),您会看到一个小十字出现。
-
堆栈空间的数量是在链接时设置的,IIRC——此时编译器和链接器等不知道或关心你的代码将在哪台机器上运行,或者它有多少内存已。除非您告诉链接器和/或编译器设置更大的堆栈,否则您将得到默认值。
标签: c++ c arrays segmentation-fault stack-overflow