在我的项目中,我创建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
时删除该子对象超出范围。 最佳答案
QSharedPointer拥有您传递给它的原始指针的所有权。这意味着一旦所有共享指针超出范围,它将删除其指向的对象。如果您已经手动删除了一个对象,那么将导致双重释放,从而导致崩溃(如果幸运的话!)。
使用共享指针,您根本不必手动调用delete,因为如上所述,这将自动发生。