C++ 删除QSharedPointer指向的QObject

C++ 删除QSharedPointer指向的QObject,c++,qt,qsharedpointer,C++,Qt,Qsharedpointer,在我的项目中,我创建了QObject实例,并给它们一个父子关系。我还想用QSharedPointer实例跟踪一些对象 当对象被删除时,通过delete childObject或删除父对象,我希望调用isNull()时QSharedPointer实例返回true 但是,在删除QSharedPointer指向的任何对象时,我的程序崩溃 这是我的密码: QObject *child = new QObject(); QSharedPointer<QObject> ptr(child); d

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

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

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

这是我的密码:

QObject *child = new QObject();
QSharedPointer<QObject> ptr(child);
delete child;
QObject*child=newqobject();
QSharedPointer ptr(子级);
删除儿童;
仅此一项就毁了我的程序。我阅读了
QSharedPointer
的文档,其中说明可以从普通指针创建
QSharedPointer对象,因此我有点困惑为什么
QSharedPointer
不能处理指向被删除的对象


QPointer
没有这个问题,我甚至可以调用
isNull()
,但是我需要
QSharedPointer
的原因是,将创建一些子对象,而不是给它们一个父对象,此时,当所有相关的
QSharedPointer
超出范围时,我希望删除子对象。

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


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

谢谢。但是,当我对父对象调用delete时,子对象也会被删除。这是我问题的症结所在。看来我不能让父母和QSharedPointer都正确处理孩子?@mrg95你需要决定选择哪种管理资源的方式。如果你想使用共享指针,那么就不要给子对象任何父对象。你认为有什么方法可以检测并阻止QSharedPointer进行第二次删除吗?可能是子类?@mrg95不,QSharedPointer的全部目的是在所有实例都超出范围后执行此操作。好的,听起来我必须将子对象存储在QVector中或父对象中的某个内容中。。。谢谢你的帮助!:)