【问题标题】:C++ Segmentation fault std::arrayC++ 分段错误 std::array
【发布时间】: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&lt;int, 2000000&gt;* a = new std::array&lt;int, 2000000&gt;();,尽管我不推荐它(支持适当(预)大小的std::vector&lt;int&gt;)。
  • @Vincent 你可以在堆上分配它,或者直接按照@πάντα ῥεῖ 的建议,或者包装在某种智能指针中,比如unique_ptrshared_ptr

标签: c++ arrays c++11


【解决方案1】:

您将一个大数组放入堆栈,导致堆栈溢出。

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

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

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

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

【讨论】:

  • 堆栈不需要已经分配,​​只需要保留内存空间:这在某些系统上略有不同。堆栈很小,因为从历史上看,内存空间实际上是一种昂贵的商品,尤其是在多线程系统中。然而,在 64 位系统上,只有几 GB 或 TB 的内存,它不再是一种昂贵的商品。
猜你喜欢
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2012-02-10
相关资源
最近更新 更多