我在 Ubuntu 中编写了一个 C++ 程序。在 main 函数中,我有这样的二维数组:
int main() {
unsigned long long int s[11000][100];
// some code to manipulate with s (just for initialization)
// ...
}
程序运行失败。在网上搜索后,我知道二维数组的大小超过了 Ubuntu 中大约 8 MB 的默认堆栈大小。我尝试了一些在我的程序中自动更改堆栈大小的建议。所以我添加了几行代码:
int main() {
unsigned long long int s[11000][100];
const rlim_t kStackSize = 32 * 1024 * 1024;
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0) {
if (rl.rlim_cur < kStackSize) {
rl.rlim_cur = kStackSize;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0) {
printf("error\n");
}
} else {
printf("error\n");
}
// some code to manipulate with s (just for initialization)
// ...
} // end main
但是我还是遇到了segmentation fault (core dumped)错误。我还检查了堆栈大小,它的大小现在是 32 MB,比二维数组的大小大 4 倍。还尝试将堆栈大小设置为 RLIM_INFINITY,但再次失败。谁能帮我找出原因和解决办法?非常感谢!
最佳答案
鉴于此内存块的大小,您应该使用 new[]
或 malloc
和 delete[]
或释放
它是适当的。或者,如果您使用的是 C++,则应使用 std::vector
或其他一些堆分配容器。
它仍然崩溃的原因是因为它仍在尝试在仍然有限的堆栈空间上分配超过某个限制,甚至在您尝试调整它之前。自动存储(即在堆栈上)中的变量在函数执行之前分配。
关于使用 setrlimit 更改堆栈大小后,C++ 仍然出现段错误(核心转储)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18987860/