第一个解决方案是:
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));
第二种解决方案有点技巧 --- 什么是“正确”的方法?
更新:
我知道一旦它离开堆栈,析构函数将被调用,我想知道其他方法。
第一个解决方案是:
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));
第二种解决方案有点技巧 --- 什么是“正确”的方法?
我知道一旦它离开堆栈,析构函数将被调用,我想知道其他方法。
如果您只是让向量超出范围,它将适当地清理自己,无需额外的工作。如果向量是类的成员变量,并且您希望在其所有者被销毁之前释放其内容,则只需调用vec.clear()。
如果您想保留向量但释放保存其内容的内存,则vec.swap(std::vector<int>());
将实现此目的。除非vec包含要保留并且只想将分配的内存缩小到接近当前size()的项目,否则没有必要将临时副本复制到原始副本中。
这不是一个有效的比较,因为这些示例处理不同类型的对象:动态持续时间和局部持续时间。您可以调用析构函数或使用交换技巧(又称 shrink_to_fit)来处理其中任何一个。正确的方法取决于您是否需要向量对象持久存在。
例如,如果有必须保持有效的引用或指针,则可能需要它持久存在,在这种情况下,无论如何分配缩小是唯一的方式。
assert(vec != NULL)
呢?因为new
操作不会返回NULL
。 - James McNellisvec.clear();
。 - sbivec = std::vector<int>();
就足够了。 - Mike Seymourvec.clear()
之后是否应该assert(vec.empty())
,告诉读者“我知道前一行代码已经清空了向量”? - James McNellis