【问题标题】:Why does a std::random_device class member cause a segfault? [duplicate]为什么 std::random_device 类成员会导致段错误? [复制]
【发布时间】:2020-04-20 13:44:47
【问题描述】:

当我使用 clan g++ main.cpp && ./a.out 编译此代码时,我得到一个段错误 (terminated by signal SIGSEGV (Adressbereichsfehler))。

gcc-Version 9.3.0
clang version 9.0.1

Run with Coliru here

#include <random>

struct Abra
{
  float hagrid[3000000];

  std::random_device voldemort{};
};

int main()
{
  Abra harry = {};
  return 0;
}

为什么会这样,我该如何解决?我尝试的是切换hagridvoldemort 的声明顺序,但它仍然存在段错误(Coliru example

【问题讨论】:

  • hagrid 太大而无法存储在堆栈上,> 11 MB。使用vector&lt;float&gt; 或通过new 在堆上分配内存。
  • 在堆栈上分配 ~12MB 可能不是最好的做法,可能会导致问题
  • 注释掉voldemort 行,你的例子仍然崩溃。该问题与std::random_device 完全无关
  • 您应该能够增加堆栈的大小。您需要参考编译器的文档。在我的一台机器上,堆栈默认为 64 kB。我必须将其更改为 16 MB 才能处理非常大的结构 Abra。
  • @SamiKuhmonen 除了堆栈大小之外,堆栈上的大数组还有其他问题吗?我倾向于将-fsplit-stack 之类的东西用于 gcc 或使用其他技术增加堆栈大小。

标签: c++ arrays random struct segmentation-fault


【解决方案1】:

为什么 std::random_device 类成员会导致段错误?

因为你的类太大了,栈上放不下,所以当你在自动存储中创建实例时,就会溢出栈(多合适;看这个网站的名字)。。 p>

hagrid 数组约为 11.4 兆字节(可能取决于 CPU 架构),大多数桌面系统上的默认堆栈大小约为 1 到 8 兆字节。

我该如何解决这个问题?

对大型对象使用动态存储。创建动态数组的最简单方法是std::vector

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2021-11-06
    • 1970-01-01
    • 2017-06-23
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多