【问题标题】:Deleting a QObject that QSharedPointer is pointing to删除 QSharedPointer 指向的 QObject
【发布时间】:2019-03-25 10:00:09
【问题描述】:

在我的项目中,我创建了QObject 实例并赋予它们父子关系。我还想用QSharedPointer 实例跟踪一些对象。

当一个对象被delete childObject;delete parentObject; 删除时,我希望QSharedPointer 实例在调用true 时返回true

但是,在删除QSharedPointer 指向的任何对象时,我的程序会崩溃。

这是我的代码:

QObject *child = new QObject();
QSharedPointer<QObject> ptr(child);
delete child;

仅此一项会使我的程序崩溃。我阅读了QSharedPointer 的文档,上面写着A QSharedPointer object can be created from a normal pointer,所以我有点困惑为什么QSharedPointer 无法处理指向被删除的对象。

QPointer 没有这个问题,我什至可以调用isNull(),但是我需要QSharedPointer 的原因是因为将创建一些子对象并且没有给定父对象,此时我想要当所有相关的QSharedPointers 超出范围时要删除的子对象。

【问题讨论】:

    标签: c++ qt qsharedpointer


    【解决方案1】:

    QSharedPointer 拥有您传递给它的原始指针的所有权。这意味着一旦所有共享指针超出范围,它将删除它指向的对象。如果您已经手动删除了一个对象,那么这将导致双重释放,从而导致崩溃(如果您幸运的话!)。

    使用共享指针,您根本不必手动调用 delete,因为如上所述,这会自动发生。

    【讨论】:

    • 谢谢。但是,当我在父对象上调用 delete 时,子对象也会被删除。这是我问题的症结所在。看来我不能让父母和 QSharedPointer 都处理孩子吧?
    • @mrg95 您需要决定选择哪种管理资源的方式。如果你想采用共享指针的方式,那么不要给子对象任何父对象。
    • 您认为有什么方法可以检测并阻止 QSharedPointer 进行第二次删除吗?也许是子类?
    • @mrg95 不,QSharedPointer 的全部意义在于,一旦所有实例都超出范围,就可以做到这一点。
    • 好吧,听起来我必须将子对象存储在 QVector 或父对象内的其他东西中......感谢您的帮助! :)
    猜你喜欢
    • 2012-09-19
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多