堆栈和堆上的STL容器

Ben*_*enj 18 c++ memory-management stl

如果std :: vector和朋友自我调整大小,这是否意味着如果我声明一个这样的向量:

std::vector<string> myvec;
Run Code Online (Sandbox Code Playgroud)

然后它将使用更多堆栈调整大小,而:

std::vector<string> *myvec = new std::vector<string>();
Run Code Online (Sandbox Code Playgroud)

会使用更多堆调整大小吗?

Ark*_*nez 25

向量在其内部分配在堆上.

对于基于堆栈的bector,在堆栈中唯一支付的是几个字节,内部缓冲区将始终从堆中分配.

因此,当您执行vec = new vector()时,您正在分配一小部分,这可能不是很好.

  • @Benj:注意向量只清理他们自己分配的内存.如果将堆分配的对象(带有'new')添加到向量,则您负责对它们调用'delete'.也许你已经知道这一点,但我想提一下以防万一...... (7认同)

Nav*_*een 9

在第一种情况下,您将在堆栈上创建向量.这并不意味着所有向量内部对象也在堆栈上.实际上,vector仍然会分配仅在堆上保存对象所需的内存.这是因为,要在堆栈上分配,您应该知道要创建多少个对象.但是这些信息不可用,因此唯一剩下的选择是从堆中为包含的对象分配内存.