1

在我的项目中,我创建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超出范围时删除子对象.

4

1 回答 1

1

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

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

于 2018-10-20T22:12:12.587 回答