1

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则将调用默认析构函数(SomeData 只有标准 Qt 容器作为字段),并且内存将被释放。现在,我只做:看来,我只是松散了指向未发布数据的指针(执行后,valgrind 表明我肯定丢失了块,我想它们来自这里)。QSharedPointersSomeDatapop_back()

所以,最后,我是对的吗?我怎样才能QSharedPointer以正确的方式从容器中删除?

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

4

1 回答 1

5

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

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

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

于 2013-08-02T20:40:10.937 回答