gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:21:26 26 4
gpt4 key购买 nike

我有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 只有标准 Qt 容器作为字段)指向SomeData实例相关,内存将被释放。现在,我只做 pop_back() : 看来,我只是松散了指向未发布数据的指针(执行后,valgrind 表明我肯定丢失了 block ,我想它们起源于这里)。

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

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

最佳答案

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

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com