假设我有一个Foo类定义如下。 如果我在 ~Foo()中没有 bars.clear(),会导致内存泄漏吗? 我想知道这个因为 bars 是一个对象字段(不是指针字段)所以当调用 ~Foo()时, std :: vector的析构函数应该自动调用,所以我想知道 std :: vector 的析构函数是否会透明地调用 .clear()。
class Foo
{
private:
std::vector<Bar*> bars;//object field
...
};
Foo::~Foo
{
//bars.clear();
}
答案 0 :(得分:3)
std::vector::clear()
删除std::vector
中的对象,并将其std::vector::size()
更改为零。如果您创建std::vector
,RAII将负责资源释放过程,但您必须等到达到向量范围之外。如果在超出范围之前,您需要清理矢量,您可以使用std::vector::clear()
。
但是在你的特殊情况下,你保持指向std::vector
内对象的指针,因此RAII会删除指针但忽略指向指针的对象。因此,在超出范围并且RAII变为活动状态或调用std::vector::clear()
之前,您必须自己清理指向指针的对象
答案 1 :(得分:2)
clear()
只会将向量重置为0大小。如果向量delete
中的Bar*
需要删除,则不会bars
任何内容,您必须执行此操作你自己。
答案 2 :(得分:-1)
如果您希望通过调用clear()方法来保护自己免受内存泄漏,那么我必须让您失望。如果你使用带指针的向量,你需要做这样的事情:
std::vector<Bar*> bars;
bars.push_back(new Bar());
// some work with bars
// ....
// end of bars usage:
// (probably inside ~Foo() )
for(int i=0; i<bars.size(); i++) delete bars[i];
根据您的经验水平和您的具体使用情况,您可能更适合使用:
std::vector<Bar> bars;
如果你想知道是否从向量的析构函数中调用了std :: vector&lt; ...&gt; :: clear()方法,那么答案是:可能但不一定,它确实没有&#无论如何。无论如何。
如果您真的很好奇,您可以通过查看矢量容器模板的头文件来检查容器类的析构函数。是否以及对用户可见的std库对象的实现细节有多少取决于您正在运行的系统。在工作中,我碰巧在Solaris 10机器上工作。这些机器上的std lib是Hewlett Packard anno 1994的一个实现,其中矢量模板使用的许多实际代码仍然可见:
~vector ()
{
__destroy(__start, __finish);
__value_alloc_type va(__end_of_storage);
va.deallocate(__start,__end_of_storage.data()-__start);
}
void clear()
{
erase(begin(),end());
}
iterator erase (iterator first, iterator last)
{
iterator i = copy(last, end(), first);
iterator tmp = __finish;
__finish = __finish - (last - first);
__destroy(i, tmp);
return first;
}