删除 QSharedPointer 指向的 QObject

Deleting a QObject that QSharedPointer is pointing to

本文关键字:QObject QSharedPointer 删除      更新时间:2023-10-16

在我的项目中,我创建了QObject实例,并为它们提供了父子关系。我还想跟踪一些带有QSharedPointer实例的对象。

当一个对象被删除时,无论是delete childObject;还是delete parentObject;,我希望QSharedPointer实例在调用isNull()时返回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超出范围时删除子对象。

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

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