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文档的一些想法,请参阅下面的评论.