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

How can I delete QSharedPointer from container the right way

本文关键字:删除 QSharedPointer 方式      更新时间:2023-10-16

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

在程序运行周期中,DataVec充满

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

调用DataVec.pop.back()DataVec.clear()后会删除(释放)QSharedPointer

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

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

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

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

如果向量中有一个指向对象的共享指针,而程序中的任何位置都没有指向该对象的共享指示器,那么从向量中删除共享指针肯定会导致对象删除。

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