我有一些使用这样的矢量的简单函数(伪代码):
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()还是可以省略?
答案 0 :(得分:28)
如果我们查看cppreference.com的std::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;
}