【发布时间】:2014-12-28 03:13:36
【问题描述】:
我有大约。我的电脑上有 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];
这也会导致分段错误。所以我的问题是,是什么导致了分段错误?
提前谢谢你。
【问题讨论】:
-
很可能是堆栈溢出,使用向量。
-
您的机器上可能有 2 GB RAM,但您的可用堆栈大小肯定更小。
-
堆栈上的
std::array恐怕不适合处理大量数据。 -
你仍然可以使用
std::array<int, 2000000>* a = new std::array<int, 2000000>();,尽管我不推荐它(支持适当(预)大小的std::vector<int>)。 -
@Vincent 你可以在堆上分配它,或者直接按照@πάντα ῥεῖ 的建议,或者包装在某种智能指针中,比如
unique_ptr或shared_ptr