C ++ Segmentation fault std :: array

时间:2014-10-31 17:58:57

标签: c++ arrays c++11

我有约。我的电脑上有2 GB的免费DRAM。编译std :: array或标准数组:

#include <iostream>
#include <array>

int main(int argc, char *argv[]){

    // int* a = new int[500000000];
    std::array<int, 2000000> a;

}

使用:

$ g++ -std=c++11 main.cpp -o main
./main

适用于两个阵列。将std :: array的大小更改为:

// ceteris paribus 
std::array<int, 2095300> a; 

导致:

$ ./main
Segmentation fault (core dumped) 
老实说,我不确定这个问题是否已在某个地方得到解决。

根据我的理解,std :: array是在堆栈上创建的,而int * ...数组是在堆上创建的。现在我的猜测是,我的堆栈可能不会大于〜8mb,相比之下,2 GB的堆听起来不成比例。因此我也试过了:

//int a[2096000];

也会导致分段错误。所以我的问题是,导致Segmentation故障的原因是什么?

提前谢谢。

1 个答案:

答案 0 :(得分:5)

你在堆栈上放了一个大数组,导致堆栈溢出。

您可以设置堆栈的大小:Change stack size for a C++ application in Linux during compilation with GNU compiler。但是,更好的选择可能是使用堆。

  

堆栈比堆 [sic] 堆小得多,这听起来有点不成比例。

堆栈是实际分配的内存,这意味着您不希望它比实际需要的大,因为如果内存用于堆栈,那么它将无法用于其他用途。另一方面,堆除非实际请求,否则不会占用内存,因此允许堆占用大部分地址空间是可以的。

堆栈通常也不需要非常大,因为函数调用的最大深度通常不是那么高。几兆字节几乎总是绰绰有余。