如果我有一个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。
答案 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 *