2015-03-18 86 views
8

在C++中有两种方法可以声明一个对象。例如:基于C++堆栈的对象分配

// The first way 
vector<int> *nums = new vector<int>; 

// The second way 
vector<int> nums; 

人们说第一个声明在堆中分配对象,在堆栈​​中分配第二个对象。我可以想象如果矢量对象在堆中,它是如何工作的。编译器只会在堆中找到一个空闲块来存储该向量。但是,如果将对象分配到堆栈上,我会不断向该向量推送新元素,会发生什么情况?会有足够的内存空间吗?如果不是,当编译器的大小可以改变时,编译器如何在堆栈中找到足够大的内存块来存储该向量?

+3

大初学者的问题,并很好地说明。 – 2015-03-18 21:59:28

回答

10

vector对象放在堆栈上并不意味着它会将其元素放在堆栈上。检查文档:

在内部,向量使用动态分配的数组来存储它们的元素。插入新元素时,可能需要重新分配此数组以便增加大小,这意味着分配新数组并将所有元素移至其中。

来源:http://www.cplusplus.com/reference/vector/vector/

+1

是的。只有“包装”向量在堆栈中。在内部它可能只包含一个指针。如果它是一个数组,那么数组大小必须因为你所问的问题而保持固定。 – 2015-03-18 22:04:56