如果我有一个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你.
如果您的项目是动态分配的,并且您的向量包含指向它们的指针,则必须delete在调用之前手动调用该容器中的每个指针clear().否则你有内存泄漏.
如果它们是未动态分配的对象,那么您不需要执行任何操作 - 在向量被清除时,将调用向量中的对象的析构函数(如果有).
std::vectorclear() 确实调用向量中每个元素的析构函数:
http://www.cplusplus.com/reference/vector/vector/clear/
但就您而言,它不会删除动态分配的内存的内容。我建议使用string而不是char*
| 归档时间: |
|
| 查看次数: |
25699 次 |
| 最近记录: |