【问题标题】:Swapping vector to free it交换矢量以释放它
【发布时间】:2021-03-10 21:22:55
【问题描述】:

我读过释放向量内存的最佳方法是:

vector<int>().swap(my_vector);

我真的不明白发生了什么。交换函数需要 2 个向量并交换它们的元素,例如:

vector<int>v1{1,2,3};
vector<int>v2{4,5,6};
v1.swap(v2);

v1 变为 {4,5,6},v2 变为 {1,2,3}。这看起来很正常。但是我的第一个示例如何释放内存?内存内部会发生什么?如果my_vector与vector()(一个空向量)交换元素,那么空向量不是得到my_vector元素,my_vector就变成空了吗?

【问题讨论】:

  • 它不会释放内存。 Swap 将第一个 v1 元素的内存地址从 v1 更改为 v2
  • 哦,这就是交换的工作原理?我认为它是通过一些 for 循环完成的:))。那么,如何释放内存呢?
  • 因为你用一个临时的空向量实例交换内存,该实例在;之后立即被销毁
  • 要释放它,请拨打vector::clear,然后拨打vector::shrink_to_fit。或者干脆让向量超出范围。取决于你想做什么。
  • 我读到shrinktofit方法不好

标签: c++ arrays pointers recursion vector


【解决方案1】:

您不仅在与一个空向量进行交换,而且还在与一个 临时 空向量进行交换。于是两个向量的内存被交换了,然后临时向量的析构函数释放了原来是my_vectors的内存。

请注意,该标准有效地保证在这种情况下swap 正在交换分配的内存。否则,此方法可能引发异常,即forbidden to do in this case。另外,请注意vector 的默认构造函数也是无异常的,因此它实际上无法分配内存。正如 Aziuth 在评论中正确指出的那样,理论上它可以有一个小容量的非动态初始缓冲区,这将在交换中传输。在实践中,这可能可以忽略不计。

【讨论】:

  • 我不知道你可以临时声明一个向量。我是向量新手,我一直只使用数组。
  • @HeroForFun 你写它的方式,vector&lt;int&gt;(),使它成为一个临时的。
  • @HeroForFun 为什么你认为你不能声明一个临时向量?您几乎可以在 C++ 中将任何东西声明为临时的。
  • 我想在你的回答中补充一点,这个临时的空向量不能保证有任何特定的容量。在几乎所有实际情况下都会有零,但理论上,它可以有任何。
  • @Aziuth 好点,谢谢!还添加了关于默认构造函数的异常保证的注释,只要您的观点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2011-05-26
  • 2012-11-13
  • 2017-09-12
  • 2011-05-24
相关资源
最近更新 更多