C++分段错误std::array

3

我电脑上有大约2GB的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,相比于2GB的堆来说显得不成比例。因此我也尝试了以下操作:

//int a[2096000];

这也会导致分段错误。那么我的问题是,什么引起了分段错误?

提前感谢你。


2
很可能是堆栈溢出,使用向量。 - Borgleader
4
你的电脑可能有2 GB内存,但可用的栈大小肯定更小。 - πάντα ῥεῖ
2
抱歉,对于大量数据来说,在堆栈上使用std::array并不合适。 - Neil Kirk
2
你仍然可以使用std::array<int, 2000000>* a = new std::array<int, 2000000>();,但我不建议这样做(而是使用适当大小的std::vector<int>)。 - πάντα ῥεῖ
2
@Vincent,你可以在堆上分配它,可以像@πάντα ῥεῖ建议的那样直接分配,也可以将其包装在某种智能指针中,例如unique_ptrshared_ptr - PeterT
显示剩余6条评论
1个回答

5
你正在在栈上放置一个大数组,导致堆栈溢出。
你可以设置堆栈的大小:更改Linux中C++应用程序的堆栈大小并使用GNU编译器进行编译。然而,更好的选择可能是使用堆。
引用块: 它听起来有些不成比例,因为堆栈比堆小得多。
堆栈是实际分配的内存,这意味着您不希望它比实际需要的更大,因为如果内存用于堆栈,则将无法用于其他用途。另一方面,除非被请求,否则堆不占用内存,因此允许堆潜在地占用地址空间的大部分是可以接受的。
堆栈通常也不需要很大,因为函数调用的最大深度通常不会很高。几兆字节通常已经足够了。

堆栈不需要预先分配,只需要保留内存空间即可:这在某些系统上略有不同。历史上,由于多线程系统中内存空间实际上是一种昂贵的资源,因此堆栈被设计得很小。然而,在具有几个吉字节或千兆字节的RAM的64位系统上,它不再是一种昂贵的资源。 - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接