我在一个面向对象的大型项目中将QVector<QSharedPointer<SomeData> > DataVec
作为一个类的字段。程序在循环执行代码部分期间获得内存溢出,其中分配了大量内存,由QSharedPointers控制。
在程序运行周期中,DataVec
填充了
DataVec.push_back(QSharedPointer<SomeData>(new SomeData()));
致电QSharedPointer
或DataVec.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()
。
答案 0 :(得分:5)
当使用pop_back
,clear
或任何其他方式从中移除项目时,QVector将调用其项目的析构函数。
如果存在向量中对象的共享指针,并且程序中的任何位置都没有更多共享指针,则从向量中删除共享指针肯定会导致对象删除。
如果在其他地方有共享指向此对象的指针,则在删除所有引用之前不会删除该对象。