堆栈溢出 - 静态内存与动态内存

smi*_*ude 4 c++ stack-overflow stack

如果int m[1000000];在C/C++的main函数内部编写,它将在堆栈溢出时收到运行时错误.相反,如果你vector<int> m;在那里写,然后push_back 1000000元素,它将运行正常.

我很好奇为什么会这样.他们都是本地记忆,不是吗?提前致谢.

Mat*_*hen 12

是的,向量本身是一个自动(堆栈)对象.但是向量包含指向其内容的指针(内部动态数组),并且将在堆上分配(默认情况下).为了简化一点,您可以将其vector视为在内部进行malloc/ reallocnew[]调用(实际上它使用分配器).

编辑:正如我所说,自动变量在堆栈上分配,而malloc通常在堆上分配.对于每个可用的存储器是平台和甚至结构特异性,但可用的堆栈存储器通常更多的限制.


And*_*ron 6

堆栈内存量有限,因为必须事先保留.但是,堆内存量通常会超出操作系统所施加的更高限制,但"几乎"达到虚拟地址空间的限制(32位机器为2GB,64位机器更多)机).

您可以增加保留堆栈空间的数量,通常作为链接器的设置.

  • 你忘了提到这是系统特定的.在GNU/Linux上,您可以使用`ulimit -s`在执行之前增加堆栈大小. (2认同)

小智 5

int m [1000000] - 它将在堆栈上分配1000000个int.因为堆栈是有限的,所以它将抛出堆栈溢出运行时错误.

矢量m; 然后push_back的1000000个元素正在工作,因为内部向量分配堆上的内存而不是堆栈上的内存.所以在你的应用程序堆栈中只存在vector对象,所以它不会抛出堆栈溢出运行时错误.