【发布时间】: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
#include <random>
struct Abra
{
float hagrid[3000000];
std::random_device voldemort{};
};
int main()
{
Abra harry = {};
return 0;
}
为什么会这样,我该如何解决?我尝试的是切换hagrid 和voldemort 的声明顺序,但它仍然存在段错误(Coliru example)
【问题讨论】:
-
hagrid太大而无法存储在堆栈上,> 11 MB。使用vector<float>或通过new在堆上分配内存。 -
在堆栈上分配 ~12MB 可能不是最好的做法,可能会导致问题
-
注释掉
voldemort行,你的例子仍然崩溃。该问题与std::random_device完全无关 -
您应该能够增加堆栈的大小。您需要参考编译器的文档。在我的一台机器上,堆栈默认为 64 kB。我必须将其更改为 16 MB 才能处理非常大的结构 Abra。
-
@SamiKuhmonen 除了堆栈大小之外,堆栈上的大数组还有其他问题吗?我倾向于将
-fsplit-stack之类的东西用于 gcc 或使用其他技术增加堆栈大小。
标签: c++ arrays random struct segmentation-fault