交换和为现有向量分配空向量有什么区别?

时间:2015-08-30 08:53:01

标签: c++ memory

有什么区别:

// bb has a million elements
vector<B>().swap(bb);
//and
bb = Vector<B>();

引擎盖下会发生什么?

2 个答案:

答案 0 :(得分:2)

一般来说,两者的语义略有不同:

  • swap将交换两个向量的内容
  • 分配会将右侧矢量的内容复制到左侧矢量,也可以根据您使用的C ++版本和一些额外参数移动/窃取它

现在,特别是您的示例和std::vector

std::vector<B>().swap(bb);

这将:

  • 创建一个空向量(让我们称之为__tmp
  • 交换两个向量的内容(即交换其内部缓冲区)
  • 销毁__tmp以及之前bb
  • 的内容

结果是bb留空。

另一方面:

bb = std::vector<B>();

将使用空向量覆盖bb的内容。根据您使用的是C ++ 03还是C ++ 11(或更高级),行为会有所不同:

  • 在C ++ 03中,bb的元素被破坏,但bb可能保留其容量(也就是说,它具有像以前一样分配给一百万个元素的内存)。
  • 在C ++ 11中,std::vector<B>的内部缓冲区可能会替换bb的内部缓冲区;没有我所知道的正式义务

因此,虽然bb将为空,但目前尚不清楚其内部容量最终是什么。

从历史上看,std::vector<B>().swap(bb)是一种清除bb内容的推荐方法,当人们想要确保降低其容量(释放内存)时。{/ p>

如今(在C ++ 11之后),有一种明确的shrink_or_fit方法可以做到这一点,但是因为它没有强制要求实际减少容量,而且由于旧习惯很难消除,你仍然可能会遇到这种形式。

答案 1 :(得分:1)

内存泄漏是由于缺少指针而无法访问的内存。 向量是一个容器,旨在执行动态分配以避免此内存泄漏,因此您作为用户不需要处理它。