我应该总是在函数结束时调用vector clear()吗?

时间:2014-02-05 03:27:24

标签: c++ vector stl stdvector

我有一些使用这样的矢量的简单函数(伪代码):

void someFunc(void) {

    std::vector<std::string> contentVector;

    // here are some operations on the vector

    // should I call the clear() here or this could be ommited ?
    contentVector.clear();

}

我应该调用clear()还是可以省略?

5 个答案:

答案 0 :(得分:28)

如果我们查看cppreference.comstd::vector::~vector条目,则会说:

  

破坏容器。调用元素的析构函数并释放已使用的存储。请注意,如果元素是指针,则不会销毁指向的对象。

所以你不必打电话给clear

如果我们想转到draft standard,我们必须查看23.2.1 一般容器要求 4 部分,其中说明:< / p>

  

在表96和97中,X表示包含T类型对象的容器类,a和b表示类型X的值,[...]

然后查看具有以下表达式条目的Table 96 — Container requirements

(&a)->~X()  

以及以下注释:

  

注意:析构函数应用于a的每个元素;所有的记忆都被解除分配。

更新

这是RAII正在行动, Bjarne Stroustrup Why doesn't C++ provide a "finally" construct?中说:

  

因为C ++支持几乎总是更好的替代方案:“资源获取是初始化”技术(TC ++ PL3第14.4节)。基本思想是通过本地对象表示资源,以便本地对象的析构函数将释放资源。这样,程序员就不会忘记释放资源。

答案 1 :(得分:15)

绝对没有必要这样做。 std::vector和所有其他容器会在它们自身被销毁时自动销毁它们的元素。这意味着他们的析构函数对此行为负责。所以,不要。

这样做的好处是容器天然异常安全 [1]

void someFunc(void) {

    std::vector<std::string> contentVector;

    // here are some operations on the vector

    throw std::runtime_error("I just want to throw!");

    contentVector.clear();
}

是否会调用contentVector.clear();行?不。但是你仍然安全,因为它可以保证调用contentVector的析构函数。

来自vector [2]

  

破坏容器。调用元素的析构函数并释放已使用的存储。请注意,如果元素是指针,则不会销毁指向的对象。


[1] 你仍然需要使你的元素异常安全(让他们在调用析构函数时正确地释放他们的资源)。

[2] 请参阅以下评论,了解有关SGI STL文档的一些想法

答案 2 :(得分:5)

不需要,一旦超出范围即会自动清除,destructor will destroy the container object.

答案 3 :(得分:1)

您可以省略使用.clear()函数,因为一旦contentVector超出了'}'的范围,vector's destructor就会运行。

这会释放存储矢量数据的内存。

答案 4 :(得分:1)

因为我认为没有其他人提到这一点,但是如果你的载体是

std::vector<std::string*> vector;

你应该在函数完成之前释放分配给每个元素的内存(除非你已经将所有权传递给其他地方 - 例如全局变量等)

for (auto i : vector) {
  delete i;
}