删除QSharedPointer指向的QObject

时间:2018-10-20 22:07:27

标签: c++ qt qsharedpointer

在我的项目中,我创建QObject实例并为其赋予父子关系。我还想通过QSharedPointer实例来跟踪某些对象。

当通过delete childObject;delete parentObject;删除对象时,我希望QSharedPointer实例在调用true时返回isNull()

但是,删除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超出范围时,我希望删除子对象。

1 个答案:

答案 0 :(得分:1)

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

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