我有约。我的电脑上有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故障的原因是什么?
提前谢谢。
答案 0 :(得分:5)
你在堆栈上放了一个大数组,导致堆栈溢出。
您可以设置堆栈的大小:Change stack size for a C++ application in Linux during compilation with GNU compiler。但是,更好的选择可能是使用堆。
堆栈比堆 [sic] 堆小得多,这听起来有点不成比例。
堆栈是实际分配的内存,这意味着您不希望它比实际需要的大,因为如果内存用于堆栈,那么它将无法用于其他用途。另一方面,堆除非实际请求,否则不会占用内存,因此允许堆占用大部分地址空间是可以的。
堆栈通常也不需要非常大,因为函数调用的最大深度通常不是那么高。几兆字节几乎总是绰绰有余。