使用 setrlimit 更改堆栈大小后,C++ 仍然出现段错误(核心转储)错误

标签 c++ c

我在 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[]mallocdelete[]释放它是适当的。或者,如果您使用的是 C++,则应使用 std::vector 或其他一些堆分配容器。

它仍然崩溃的原因是因为它仍在尝试在仍然有限的堆栈空间上分配超过某个限制,甚至在您尝试调整它之前。自动存储(即在堆栈上)中的变量函数执行之前分配。

关于使用 setrlimit 更改堆栈大小后,C++ 仍然出现段错误(核心转储)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18987860/

相关文章:

c++ - 有操作系统和没有操作系统的两个空 main{} 程序有什么区别?

c++ - 如何避免重新编译头文件

c++ - 如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅是 DLL 文件)

c - poll() 在 macOS 上为超过 256 个描述符返回 EINVAL

c++ - 学习C或C++会对我的计算机造成危险吗?

c - 如何检测 stm32f4discover 上的按钮按下?

c++ - 为什么 std::make_pair 不返回一对?或者是吗?

c++ - 将转换范围缩小到更大的类型(然后再返回)

c++ - 包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

c - C中的内存替换?