在一个大型的面向对象的项目中,我将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()

最佳答案

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

如果 vector 中存在指向该对象的共享指针,并且在程序中的任何地方都没有该对象的共享指针,则从 vector 中删除共享指针肯定会导致对象删除。

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

关于c++ - 如何以正确的方式从容器中删除QSharedPointer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18024344/

10-09 05:37