c++ - 大数组上的段错误

标签 c++ arrays segmentation-fault

以下代码在 2GB 计算机上运行时出现段错误,但在 4GB 计算机上运行。

int main()
{
   int c[1000000];
   cout << "done\n";
   return 0;
}

数组的大小仅为 4Mb。 C++ 中可以使用的数组的大小是否有限制?

最佳答案

您可能只是在这里遇到堆栈溢出。该数组太大,无法放入程序的堆栈区域;对于大多数主流桌面/服务器操作系统上的用户空间代码,堆栈增长限制通常为 8 MiB 或 1 MiB。 (普通 C++ 实现使用 asm 堆栈进行自动存储,即非 static 局部变量数组。这使得当函数返回或异常通过它们传播时,可以免费释放它们。)

如果你动态分配数组,你应该没问题,假设你的机器有足够的内存。

int* array = new int[1000000];    // may throw std::bad_alloc

但请记住,这将要求您 delete[]手动数组以避免内存泄漏,即使您的函数通过异常退出。在现代 C++ 中强烈建议不要手动新建/删除,更喜欢 RAII .

<小时/>

更好的解决方案是使用 std::vector<int> array (cppreference)。如果您知道它会增长到多大,您可以为 1000000 个元素保留空间。甚至resize它默认构造它们(即对内存进行零初始化,这与声明没有初始化程序的普通 C 样式数组不同),例如 std::vector<int> array(1000000)

std::vector对象超出范围,它的析构函数将为您取消分配存储,即使这是通过父函数捕获的子函数中的异常发生的。

关于c++ - 大数组上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26505955/

相关文章:

C++ - STL vector 问题

c++ - 这是什么代码?为何起作用? C++

c++ - Visual Studio 2010 中的 Qt Link 共享库

c++ - 了解 C++ 中的外部模板

c++ - g++ 在正常编译时会产生段错误,但在 -g 时不会

php - 使用列名从 MySQL 返回 JSON

javascript - JavaScript 中的按位运算符作为状态标志

c - 从c中的文件中读取分号后的整数 "unfixed"个数

c++ - 虚拟析构函数使用数组失败

c++ - 线路运算符(operator)新的段错误