数组崩溃超过120000个元素

时间:2013-08-15 00:33:39

标签: c++ arrays

当我这样做时:

vector<double> myVect(120000000, 0);

我可以让矢量看起来像我想要的那么多元素。但是,当我这样做时:

double myArray[120000];

在我的程序崩溃之前,我被限制在大约120000-130000个元素的某个位置。有什么东西搞砸了或阵列真的有限吗?

6 个答案:

答案 0 :(得分:6)

数组本身不限于任何固定大小,但您在自动存储中分配的数组(通常称为&#34;堆栈&#34;)仅限于堆栈的大小。在静态存储中分配大型数组时,可以制作更大的数组。动态分配也是如此:无论您在不触发内存溢出的情况下分配的向量大小,都可以使用new运算符创建相同大小的数组。

例如,您可以在不触发堆栈溢出的情况下执行此操作:

static double myArray[120000000]; // static memory area

或者这个:

double *myArray = new double[120000000]; // dynamic memory area

答案 1 :(得分:0)

vector在堆上分配内存,而示例中的myArray在堆栈上分配内存,这可能导致堆栈溢出。

堆栈主要用于存储函数参数,返回值等,不应存储大量数据。这就是为什么它通常具有OS指定的有限大小。

另一方面,堆是完全不同的。它可以根据其用途“增长”。如果堆耗尽所有内存,它可能会使用磁盘上的交换空间。所以它可能比堆栈大得多。

答案 2 :(得分:0)

myArray中,您试图在堆栈上分配120000(从而导致崩溃),而在myVect上,您在堆上执行此操作。

答案 3 :(得分:0)

程序可以使用的堆栈空间量有限。如果在堆上分配数组(使用new运算符),一切都应该没问题。 std::vector还在堆上分配对象。

答案 4 :(得分:0)

数组和std::vector在C ++中有所不同。 'Array'是静态分配的,这意味着它从堆栈中获取内存。但是std::vector是动态分配的,这意味着它从所谓的“免费存储”或“堆”中获取内存。

这就是为什么你可以有一个大的矢量但是有一个极限大小的数组。

答案 5 :(得分:0)

在几乎所有现代C ++编译器中,每个双字节长度为8个字节。它们的数组将消耗:

120000 * 8 = 960,000 
130000 * 8 = 1,040,000

这意味着程序中每个堆栈帧的大小大约为1 MB。由于数组(以及所有其他“自动变量”)存储在堆栈中,因此每个函数限制为1 MB。向量和其他对象使用堆内存,它允许你有几GB的空间。

如果您需要增加堆栈大小,请查看此主题: Change stack size for a C++ application in Linux during compilation with GNU compiler