在我的项目中,我创建了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都超出范围时删除子对象。
发布于 2018-10-20 22:12:12
QSharedPointer获取传递给它的原始指针的所有权。这意味着一旦所有共享指针超出范围,它将删除它指向的对象。如果您已经手动删除一个对象,那么这将导致双空闲,这将导致崩溃(如果您是幸运的!)。
使用共享指针,您根本不需要手动调用delete,因为如上所述,这将自动发生。
https://stackoverflow.com/questions/52910510
复制相似问题