【发布时间】:2020-12-04 20:40:28
【问题描述】:
我在 Ubuntu 18.04 上使用 gcc 10.1。在定义一个大的堆栈分配变量时,我遇到了段错误,即使我的堆栈似乎足够大以容纳它。这是一个代码sn-p:
#include <iostream>
#include <array>
#include <sys/resource.h>
using namespace std;
int main() {
if (struct rlimit rl{1<<28, 1l<<32}; setrlimit(RLIMIT_STACK, &rl))
cout << "Can not set stack size! errno = " << errno << endl;
else
cout << "Stack size: " << rl.rlim_cur/(1<<20) << "MiB to " << rl.rlim_max/(1<<20) << "MiB\n";
array<int8_t, 100'000'000> a;
cout << (int)a[42] << endl;
}
使用 gcc 编译时会出现段错误,但使用 clang 11.0.1 编译时运行良好并输出:
Stack size: 256MiB to 4096MiB
0
编辑
Clang 正在删除 a 的分配。这是一个更好的例子:
#include <iostream>
#include <array>
#include <sys/resource.h>
using namespace std;
void f() {
array<int8_t, 100'000'000> a;
cout << (long)&a[0] << endl;
}
int main()
{
if (struct rlimit rl{1<<28, 1l<<32}; setrlimit(RLIMIT_STACK, &rl))
cout << "Can not set stack size! errno = " << errno << endl;
else
cout << "Stack size: " << rl.rlim_cur/(1<<20) << "MiB to " << rl.rlim_max/(1<<20) << "MiB" << endl;
array<int8_t, 100'000'000> a; // line 21
cout << (long)&a[0] << endl; // line 23
f();
}
您可以在以下位置找到:https://wandbox.org/permlink/XMaGFMa7heWfI9G8。注释掉第 21 行和第 23 行时,它运行良好,否则会出现段错误。
【问题讨论】: