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

时间:2010-10-14 04:06:29

标签: c++ stack stack-overflow

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

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

4 个答案:

答案 0 :(得分:12)

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

编辑:正如我所指出的,自动变量在堆栈上分配,而malloc通常在堆上分配。每个可用内存都是平台甚至是特定于配置的,但可用的堆栈内存通常很多更受限制。

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

矢量对象本身在堆栈上;但在内部它会根据需要从堆中分配内存来存储任意数量的元素。所以堆栈成本很小并且固定不变。