如何从内存中清除C++中的向量

Jok*_*ini 5 c++

我是C++的新手,所以这可能是一个新手问题但是我并不完全清楚如何从内存中清除它.我在网上搜索并看了几个答案,但不知道如何正确执行我想做的事情.

如何在c ++中正确地从内存中清除矢量?谢谢,如果这是一个重复的帖子,我道歉.

vector<ElementData> Elements;
Run Code Online (Sandbox Code Playgroud)

如下面的评论所述,我想返回使用的内存.

除了它不会向系统返回任何内存,因为容量保持不变.

Nat*_*ica 12

如果你想重置向量回到空状态,那么我们可以使用这个swap技巧将向量的内容交换成一个临时的,它会被破坏并释放内存

vector<ElementData> Elements
// fill the vector up
vector<ElementData>().swap(Elements);
Run Code Online (Sandbox Code Playgroud)

这将创建一个临时空向量,将其与您拥有的向量交换,现在它为空,然后销毁临时向量中的所有内容.

你可以看到它在这个小例子中工作

int main() {
    std::vector<int> foo(500);
    std::cout << foo.capacity() << std::endl;
    std::vector<int>().swap(foo);
    std::cout << foo.capacity() << std::endl;
}       
Run Code Online (Sandbox Code Playgroud)

Live Example

  • 为什么不只是`Elements = vector <ElementData>();`? (2认同)
  • @ChristianHackl 这应该可行,但我担心向量仍然能够保持其容量。我不确定标准对此有何规定。 (2认同)
  • @Peregring-lk 不,我不。FWIW,制作一个类似 `template &lt;typename... Params&gt; voidclear_vector_memory(std::vector&lt;Params...&gt;&amp; vec) { vector&lt;Params...&gt;().swap(vec); 的函数;}` 可能会更好。这样你的代码就变成了“clear_vector_memory(my_vector);” (2认同)

Joh*_*erg 11

std::vector 变量通常在超出范围时自动销毁,或者当它们所属的类对象被销毁时。std::vector 的析构函数也会破坏向量中的所有元素。

要明确地完全清除向量,首先清除向量(销毁元素)

v.clear()
Run Code Online (Sandbox Code Playgroud)

然后返回之前为向量元素保留的内存

v.shrink_to_fit();
Run Code Online (Sandbox Code Playgroud)

http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

shrink_to_fit当向量之前包含的元素可能比您要填充的元素多得多时才调用。

  • 是的,但在 as-if 规则下无法观察到分配,因此标准很难有更强的措辞。我不知道任何没有 opshrink_to_fit 的符合 C++11 的编译器。VS 和 gcc 肯定有“真实”的。 (2认同)