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

Why does a std::random_device class member cause a segfault?

当我用 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)

Why does a std::random_device class member cause a segfault?

因为你的class栈放不下,所以你在自动存储中创建实例的时候溢出了栈(多么合适;看这个网站的名字).

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

how can I fix this?

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