当向量被分配时,他们是否使用堆或堆栈上的内存?

以下所有的陈述是正确的吗?

vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

vector或任何其他STL容器中Type的内存是如何分配的?

 vector<Type> vect; 

将在堆栈上分配vector (即标题信息),但是分配空闲存储(“堆”)上的元素。

 vector<Type> *vect = new vector<Type>; 

在免费商店分配一切。

 vector<Type*> vect; 

将分配堆栈上的vector和免费商店中的一堆指针,但是这些点是由你如何使用它们决定的(你可以将元素0指向自由存储区,元素1指向堆栈)。

假设一个实际上有一个堆栈和一个堆的实现(标准C ++没有要求有这样的事情)唯一真实的声明是最后一个。

 vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack 

这是真的,除了最后一部分( Type不会在堆栈上)。 想像:

  void foo(vector<Type>& vec) { // Can't be on stack - how would the stack "expand" // to make the extra space required between main and foo? vec.push_back(Type()); } int main() { vector<Type> bar; foo(bar); } 

同样:

  vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack 

除了最后一部分,还有一个类似的反例:

  void foo(vector<Type> *vec) { // Can't be on stack - how would the stack "expand" // to make the extra space required between main and foo? vec->push_back(Type()); } int main() { vector<Type> *bar = new vector<Type>; foo(bar); } 

对于:

 vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

这是真的,但请注意Type*指针将在堆上,但它们指向的Type实例不必是:

  int main() { vector<Type*> bar; Type foo; bar.push_back(&foo); } 
 vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack 

不, vect将在堆栈中,但它在内部用于存储项目的数组将在堆上。 项目将驻留在该数组中。

 vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack 

与上面相同,只有vector类将在堆上。

 vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

vect将在堆栈上,它的项(指向Type )将在堆上,而且不能指出指针将指向哪个Type 。 可能在堆栈上,可能在堆上,可能在全局数据中,可能是无处(即NULL指针)。

顺便说一下,这个实现实际上可以将一些向量(通常是小尺寸)完全存储在堆栈中。 不是我知道任何这样的实现,但它可以。

只有这个陈述是真实的:

 vector <Type*> vect; //vect will be on stack and Type* will be on heap. 

Type*指针在堆上分配,因为指针的数量可以dynamic改变。

在这种情况下vect被分配在堆栈上,因为你将它定义为本地堆栈variables。