std :: vector <t> :: clear()是否调用了内容的析构函数?</t>

时间:2014-03-28 09:54:10

标签: c++ vector

如果我有一个std :: vector的东西(比方说,std :: vector :: clear()会调用内容的析构函数吗?例如,如果我有一个数据作为vector,下面的代码是否有效?< / p>

char * pd;
for(vector<char *>::iterator it = data.begin(); it != data.end(); ++it) {
  pd = *it;
  delete pd;
}

或者,它是多余的,因为data.clear()会这样做吗?我认为不是,即需要手动重新分配内容。我认为,data.clear()不会为内容调用隐式析构函数?这是对的吗?这适用于预C ++ 11。

3 个答案:

答案 0 :(得分:23)

要回答你的标题:std::vector<T>::clear()会为每个元素调用析构函数。但是,对于像char*这样的原始数据类型,析构函数是微不足道的(对于“什么都不做”而言是标准的),这实际上与没有调用析构函数的情况相同。

注意:析构函数与delete运算符不同。

那么你的问题应该是什么:std::vector<T*>::clear()是否会在其元素上调用delete?”,答案是:不,它不会调用{{1 }}。您必须手动执行此操作,如示例代码中所示,或者您可以(并且可能应该)使用delete或智能指针等对象而不是原始指针。那些为你做内存管理,他们的析构函数(被调用,见上文)为你调用std::string

答案 1 :(得分:7)

如果您的项目是动态分配的,并且您的向量包含指向它们的指针,则必须在调用delete之前在该容器中的每个指针上手动调用clear()。否则你有内存泄漏。

如果它们是没有动态分配的对象,那么你不需要做任何事情 - 当向量被清除时,将调用向量中对象的析构函数(如果有的话)。

答案 2 :(得分:3)

std :: vector clear()会调用向量中每个元素的析构函数:

http://www.cplusplus.com/reference/vector/vector/clear/

但在你的情况下,它不会删除你分配的dinamically内存的内容。我建议使用 string 而不是 char *