STL容器是否像shared_ptr
一样聪明?
当他们超出范围时,他们会自行解除分配,但是分配操作呢?
vector<int> aa(9);
...fill aa...
vector<int> bb;
aa = bb;
分配操作是否正确解除了aa
中的所有内容?
答案 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)
对于赋值前向量的每个现有元素,将调用对象的析构函数。这与容器内发生的任何内存分配无关,这是一个通常无关紧要的实现细节。