【问题标题】:With a 2D vector, does calling clear() on the 1st level clear all the memory associated with that vector?对于二维向量,在第一级调用 clear() 是否会清除与该向量关联的所有内存?
【发布时间】:2021-03-20 07:53:24
【问题描述】:

我有一个这样声明的二维向量:

vector<vector<uint16_t>> vector;

这个用完之后,我需要清空所有与之关联的内存,即使是[][X]维度的元素,我可以简单的做吗:

vector.clear();

或者我是否必须遍历内部的每个向量并在它们上调用 .clear() ,然后才能最终在主向量上调用它?如果是这样的话,什么是干净的解决方案?

【问题讨论】:

  • 注:我想我们通常称之为第一级,而不是第二级。
  • 对于 2D 向量,在第 1 级调用 clear() 是否会清除与该向量关联的所有内存? -- 是的。
  • @PaulMcKenzie 请不要在 cmets 部分回答。 cmets 部分的答案不能经过同行评审。例如,我可以否决你的投票,因为它是错误的。

标签: c++ memory vector


【解决方案1】:

由于向量在自身被破坏时会巧妙地破坏其元素并释放使用的内存,并且v.clear() 也会破坏向量中的元素,因此调用v.clear() 是删除整个二维向量的完全有效的方法。

请注意,如果您还想清理 v 本身的内存,则需要在 v.clear() 之后调用 v.shrink_to_fit()

【讨论】:

  • 请注意,根据底层系统管理内存的方式,您可能看不到程序的内存消耗有任何变化。内存可能会被标记为回收,但不会被回收。
  • 这并不完全正确。不能保证分配给内部向量的空间(尽管不是它们的内容!)将被释放。
  • 但是....
  • shrink_to_fit 只是一个提示
  • @AsteroidsWithWings 在这一点上,你正在分裂头发。分配器可以是具有无操作free 的碰撞分配器。或者分配器可能永远不会将内存返回给操作系统。或者操作系统可能拒绝将此内存释放给其他进程。或者操作系统运行的虚拟机的管理程序可能不会将内存返回给主机。没有尽头。
【解决方案2】:

对于 2D 向量,在第一级调用 clear() 是否会清除所有相关的内存 用那个向量?

是的,clear 会清除容器中的所有元素。

引用here

std::vector&lt;T,Allocator&gt;::clear

在此调用之后,size() 返回零。 使引用包含元素的任何引用、指针或迭代器无效。任何 过去的迭代器也失效了。

但这不会以任何方式影响内部存储的分配/解除分配。所以,如果你想问,

使用 2D 向量,是否在第一级调用 clear() FREE 所有相关的内存 用那个向量?

没有。按照标准,

保持向量的容量()不变(注意:标准对 容量变化在vector::reserve的规范中,见1)

所以,如果你想释放内存,要么选择shrink_to_fit(),要么用空向量更好地交换内容。这是大多数(但不是所有)实现所做的。

v.swap(std::vector<T>());
v.swap(std::vector<std::vector<T>>()); // if vector of vectors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2015-08-27
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多