std::vector:<T>:clear() 是否调用内容的析构函数?
Does std::vector<T>::clear() call destructor of the content?
如果我有一个std::vector(例如,std::vector::clear()是否调用内容的析构函数?例如,如果我有一个数据作为向量,下面的代码有效吗?
char * pd;
for(vector<char *>::iterator it = data.begin(); it != data.end(); ++it) {
pd = *it;
delete pd;
}
或者,它是多余的,因为data.clear()会这样做吗?我认为不会,即需要手动重新分配内容。我想,data.clear()不会为内容调用隐式析构函数。对吗?
回答您的标题:std::vector<T>::clear()
确实为每个元素调用析构函数。然而,对于像char*
这样的原始数据类型,析构函数是微不足道的("什么都不做"的标准说法),这实际上与没有调用析构函数是一样的。
注意:析构函数与delete
操作符不同。
所以你的问题应该是:"std::vector<T*>::clear()
调用delete
的元素吗?",这里的答案是:不,它不调用delete
。您必须像示例代码中所示的那样手动完成它,或者您可以(并且可能应该)使用std::string
或智能指针之类的对象来代替原始指针。它们为您做内存管理,它们的析构函数(被调用,见上文)为您调用delete
。
如果你的项目是动态分配的,你的向量包含指向它们的指针,你必须在调用clear()
之前手动调用该容器中的每个指针的delete
。否则就会出现内存泄漏。
如果它们不是动态分配的对象,那么你不需要做任何事情——在vector中对象的析构函数(如果有的话)将在vector被清除时被调用。
std::vector clear()不调用vector中每个元素的析构函数:
http://www.cplusplus.com/reference/vector/vector/clear/但是在您的情况下,它不会删除动态分配的内存中的内容。我建议使用字符串而不是字符*
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常