如果在C / C ++的主函数内写int m[1000000];
,它将在堆栈溢出时出现运行时错误。相反,如果你在那里写vector<int> m;
然后push_back 1000000元素,它将运行正常。
我很好奇为什么会这样。他们都是本地记忆,不是吗?提前致谢。
答案 0 :(得分:12)
是的,矢量本身是一个自动(堆栈)对象。但是向量包含指向其内容的指针(内部动态数组),并且将在堆上分配(默认情况下)。为了简化一点,您可以将vector
视为在内部执行malloc
/ realloc
或new[]
调用(实际上它使用allocator)。
编辑:正如我所指出的,自动变量在堆栈上分配,而malloc
通常在堆上分配。每个可用内存都是平台甚至是特定于配置的,但可用的堆栈内存通常很多更受限制。
答案 1 :(得分:6)
堆栈内存量有限,因为必须事先保留。但是,堆内存量通常会超出操作系统所施加的更高限制,但“几乎”达到虚拟地址空间的限制(32位机器为2GB,64位机器更多)机)。
您可以增加保留堆栈空间的数量,通常作为链接器的设置。
答案 2 :(得分:5)
int m [1000000] - 它将在堆栈上分配1000000个整数。因为堆栈是有限的,所以它会抛出堆栈溢出运行时错误。
vector m;然后push_back的1000000个元素正在运行,因为内部向量分配堆上的内存而不是堆栈。所以在你的应用程序堆栈中只存在vector对象,所以它不会引发堆栈溢出运行时错误。
答案 3 :(得分:1)
矢量对象本身在堆栈上;但在内部它会根据需要从堆中分配内存来存储任意数量的元素。所以堆栈成本很小并且固定不变。