在一个大型的面向对象的项目中,我将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()
。 最佳答案
当使用pop_back
,clear
或任何其他方式将项目从其移除时,QVector将调用其项目的析构函数。
如果 vector 中存在指向该对象的共享指针,并且在程序中的任何地方都没有该对象的共享指针,则从 vector 中删除共享指针肯定会导致对象删除。
如果在其他地方有指向该对象的共享指针,则在删除所有引用之前,不会删除该对象。
关于c++ - 如何以正确的方式从容器中删除QSharedPointer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18024344/