“正确”的释放std::vector对象的方法

46

第一个解决方案是:

std::vector<int> *vec = new std::vector<int>;
assert(vec != NULL);
// ...
delete vec;

一种替代方案是:

std::vector<int> v;
//...
vec.clear();
vec.swap(std::vector<int>(vec));

第二种解决方案有点技巧 --- 什么是“正确”的方法?

更新:

我知道一旦它离开堆栈,析构函数将被调用,我想知道其他方法。


12
为什么要加上assert(vec != NULL)呢?因为new操作不会返回NULL - James McNellis
6
一些旧的实现(或没有异常处理机制的编译器!) - Martin Beckett
5
第二种(也是唯一正确的)变体显然不需要 vec.clear(); - sbi
2
@sbi:正如它所写的那样,它使用了“复制并交换”技巧来保留数据并释放任何额外的容量。要释放所有内存,vec = std::vector<int>();就足够了。 - Mike Seymour
3
虽然我不反对,但我认为测试(或记录)基本实现功能是有些奇怪的。在调用vec.clear()之后是否应该assert(vec.empty()),告诉读者“我知道前一行代码已经清空了向量”? - James McNellis
显示剩余6条评论
12个回答

0

如果您只是让向量超出范围,它将适当地清理自己,无需额外的工作。如果向量是类的成员变量,并且您希望在其所有者被销毁之前释放其内容,则只需调用vec.clear()。

如果您想保留向量但释放保存其内容的内存,则vec.swap(std::vector<int>());将实现此目的。除非vec包含要保留并且只想将分配的内存缩小到接近当前size()的项目,否则没有必要将临时副本复制到原始副本中。


0

这不是一个有效的比较,因为这些示例处理不同类型的对象:动态持续时间和局部持续时间。您可以调用析构函数或使用交换技巧(又称 shrink_to_fit)来处理其中任何一个。正确的方法取决于您是否需要向量对象持久存在。

例如,如果有必须保持有效的引用或指针,则可能需要它持久存在,在这种情况下,无论如何分配缩小是唯一的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接