以下代码在 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++ 中强烈建议不要手动 new/deleteRAII https://en.cppreference.com/w/cpp/language/raii.
更好的解决方案是使用std::vector<int> array
(参考参数 https://en.cppreference.com/w/cpp/container/vector)。如果您知道它会增长到多大,您可以为 1000000 个元素保留空间。甚至resize
它默认构造它们(即对内存进行零初始化,这与声明没有初始化程序的普通 C 样式数组不同),例如std::vector<int> array(1000000)
当。。。的时候std::vector
对象超出范围,它的析构函数将为您取消分配存储,即使这是通过父函数捕获的子函数中的异常发生的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)