C++分段错误std::array

C++ Segmentation fault std::array

本文关键字:array std 错误 分段 C++      更新时间:2023-10-16

我的电脑上有大约2 GB的可用DRAM。编译std::数组或标准数组:

#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::数组的大小更改为:

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

导致:

$ ./main
Segmentation fault (core dumped) 

老实说,我不确定这个问题是否已经在某个地方得到了解决。

根据我的理解,std::数组是在堆栈上创建的,而int*。。。堆上的数组。现在我的猜测是,也许我的堆栈根本不比~8mb大,与2GB的堆栈相比,这听起来不成比例。因此,我也尝试了:

//int a[2096000];

这也导致分割故障。所以我的问题是,是什么导致了分割错误?

提前谢谢。

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

您可以设置堆栈的大小:在使用GNU编译器编译期间,更改Linux中C++应用程序的堆栈大小。然而,一个更好的选择可能是使用堆。

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

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

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