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

Mic*_*icz 29 c++ stl vector 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();

}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 28

如果我们查看std :: vector :: 〜vector的cppreference.com条目,它会说:

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

所以没有您不必调用清楚.

如果我们想要达到标准草案,我们必须查看23.2.1 一般容器要求4段,其中说:

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

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

(&a)->~X()  
Run Code Online (Sandbox Code Playgroud)

以及以下说明:

注意:析构函数应用于a的每个元素; 所有内存都被释放.

更新

这是RAII的行动,正如Bjarne Stroustrup所说,为什么C++不提供"最终"构造?:

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


Mar*_*cia 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();
}
Run Code Online (Sandbox Code Playgroud)

这条线contentVector.clear();会被调用吗?不,但是你仍然安全,因为它可以保证contentVector会被调用析构函数.

矢量[2]:

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


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

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

  • 问题是SGI没有记录官方标准,它记录了它的前身.有一些微妙的,不那么微妙的差异.请参阅http://stackoverflow.com/questions/5266386/what-are-the-specific-differences-between-the-original-stl-and-those-parts-of-it (2认同)

Var*_*aro 5

没有必要,一旦超出范围,它将自动清除,即析构函数将破坏容器对象.