std :: vector <T> :: clear()调用内容的析构函数吗?

Dr.*_*ana 17 c++ vector

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

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

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

Arn*_*rtz 26

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

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

所以你的问题应该是:"是否std::vector<T*>::clear()要求delete它的元素?" 这里的答案是:不,它没有打电话delete.您必须手动执行此操作,如示例代码中所示,或者您可以(并且可能应该)使用对象std::string或智能指针而不是原始指针.那些为你做内存管理,他们的析构函数(被调用,见上文)称之为delete你.

  • `std :: vector <T> :: clear()`总是调用每个元素的析构函数,但是指针的析构函数是一个无操作符(或者一个指针有一个简单的析构函数).(这是关于你在实践中所说的内容,但更接近于标准如何描述事物.) (6认同)

mat*_*975 7

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

如果它们是未动态分配的对象,那么您不需要执行任何操作 - 在向量被清除时,将调用向量中的对象的析构函数(如果有).


DrD*_*DrD 5

std::vectorclear() 确实调用向量中每个元素的析构函数:

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

但就您而言,它不会删除动态分配的内存的内容。我建议使用string而不是char*

  • @Mhd.Tahawi:它确实调用指针的析构函数。只是指针的析构函数是一个不执行任何操作的普通析构函数。它不会特别调用“delete”(毕竟,您可以有一个“std::vector&lt;char*&gt;”,其中“char*”在堆栈上分配)。 (3认同)

归档时间:

查看次数:

25699 次

最近记录:

11 年,7 月 前