STL容器是否像shared_ptr一样进行智能释放?

时间:2016-01-29 16:38:12

标签: c++ c++11 stl

STL容器是否像shared_ptr一样聪明?

当他们超出范围时,他们会自行解除分配,但是分配操作呢?

vector<int> aa(9);
...fill aa...
vector<int> bb;
aa = bb;

分配操作是否正确解除了aa中的所有内容?

3 个答案:

答案 0 :(得分:5)

标准库容器的分配是完全安全的,如果(在每种情况下)项目类型的分配是安全的。

这是优先使用标准库容器的部分原因:它们是安全的。

容器不会泄漏内存但是如果在包含大量项目后容纳容器,容器可能会保留已分配的内存,其容量,以便有效重用它而不是以后分配新内存(这样做成本很高)。这可以给出一些与真实内存泄漏相同的症状,并且在某种程度上它可以被视为一种泄漏。由于容器是安全的,当容器变空或接近空时,您可以通过调用 shrink_to_fit (非绑定)或 {{1}轻松调整容量。 - 使用相同容器类型的临时实例来填充内容,可以是空的,也可以是要保留的项目的副本。

示例:

swap

结果的具体细节取决于构建程序时使用的编译器和选项。

但是,例如使用MinGW g ++ 5.1.0:

Created #1.
Created #2.
Created #3.
Created #4.
Created #5.
Created #6.
Created #7.
capacity with 7 items: 8
Destroyed #3.
Destroyed #4.
Destroyed #5.
Destroyed #6.
Destroyed #7.
capacity with 2 items: 8
Capacity after forced reduce: 2
Destroyed #1.
Destroyed #2.

答案 1 :(得分:5)

  

分配操作是否正确解除了 <div class="pull-right fix-overflow"> 中的所有内容?

所有包含的对象都被正确销毁,并且分配是安全的。

内存不一定要解除分配。 aa可以将内存重用于从aa复制的对象。 <{1}}被销毁时会发生重新分配。

答案 2 :(得分:2)

对于赋值前向量的每个现有元素,将调用对象的析构函数。这与容器内发生的任何内存分配无关,这是一个通常无关紧要的实现细节。