使用std :: vector重新赋值的内存解除分配

时间:2012-05-10 11:33:56

标签: c++ vector

假设我VectorAVectorB两个std::vector<SameType>,两者都已启动(我的意思是VectorA.size() > 0VectorB.size() > 0

如果我这样做:

VectorA = VectorB;

自动释放为VectorA分配的内存?

2 个答案:

答案 0 :(得分:5)

在所有包含对象的析构函数被调用的意义上释放它,并且向量不再拥有内存。 1

但实际上,它刚刚返回allocator,可能会或可能不会将其返回到操作系统。

只要在使用的分配器中没有错误,您就没有创建内存泄漏,如果这是您关心的问题。

<小时/> <子> 1。正如@David在下面的评论中指出的那样,内存不一定要取消分配,具体取决于大小是否需要更改。

答案 1 :(得分:2)

一般来说,不一定是。将一个向量分配给另一个向量时,后置条件是两个数组在操作结束时将包含等效的对象。

如果目标向量的capacity足够,可以通过调用min( v1.size(), v2.size() )元素集上的赋值运算符来实现操作,然后破坏其余元素如果目标向量包含更多元素,或者复制构造末尾的额外元素。在这种情况下,不会进行内存释放或分配。

如果目标向量没有足够的容量,那么它将创建一个具有足够容量的新缓冲区,并且 copy-construct 来自源向量的新缓冲区中的元素。然后它将交换旧缓冲区和新缓冲区,销毁所有旧对象并释放旧缓冲区。在这种情况下,旧对象销毁并释放旧内存,但这只是一种情况。