如何以正确的方式从容器中删除QSharedPointer

时间:2013-08-02 19:03:39

标签: c++ qt containers shared-ptr qsharedpointer

我在一个面向对象的大型项目中将QVector<QSharedPointer<SomeData> > DataVec作为一个类的字段。程序在循环执行代码部分期间获得内存溢出,其中分配了大量内存,由QSharedPointers控制。

在程序运行周期中,DataVec填充了

DataVec.push_back(QSharedPointer<SomeData>(new SomeData()));

致电QSharedPointerDataVec.pop.back()后会DataVec.clear()被删除(已发布)吗?

我想:不。我们必须为QSharedPointer显式调用析构函数(我在Qt中也看不到像boost :: shared_ptr :: reset()这样的方法)。如果我们没有更多SomeData指向QSharedPointers实例,那么将调用SomeData默认析构函数(SomeData只有标准Qt容器作为字段),并释放内存。现在,我只做pop_back():似乎,我只是松散指向未发布的数据(执行后,valgrind表示我肯定丢失了块,我想它们来自这里)。

所以,最后,我是对的吗? 如何以正确的方式从容器中删除QSharedPointer

编辑1: Qt中的boost :: shared_ptr :: reset()方法是QSharedPointer::clear()

1 个答案:

答案 0 :(得分:5)

当使用pop_backclear或任何其他方式从中移除项目时,QVector将调用其项目的析构函数。

如果存在向量中对象的共享指针,并且程序中的任何位置都没有更多共享指针,则从向量中删除共享指针肯定会导致对象删除。

如果在其他地方有共享指向此对象的指针,则在删除所有引用之前不会删除该对象。