删除 QSharedPointer 指向的 QObject
Deleting a QObject that QSharedPointer is pointing to
在我的项目中,我创建了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
超出范围时删除子对象。
QSharedPointer 取得您传递给它的原始指针的所有权。这意味着一旦所有共享指针都超出范围,它将删除它指向的对象。如果您已经手动删除了一个对象,那么这将导致双重释放,从而导致崩溃(如果幸运的话!
使用共享指针,您根本不需要手动调用 delete,因为这将如上所述自动发生。
相关文章:
- 删除 QSharedPointer 指向的 QObject
- QObject::连接无法将信号连接到*this*对象的插槽
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- QML/C++/QObject Struct Copy
- QObject::d eleteLater在我的Qt测试中没有像预期的那样调用
- 具有 QObject 继承的单例 - Qt
- QObject::连接不起作用 - 使用函数语法找不到信号
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 智能指针作为 QObject::d eleteLater() 的替代品
- Shiboken2 qobject.h:46:10:致命:找不到'QtCore/qobjectdefs.h'文件
- 在 dll 中为 qLibrary 编译 qobject 时出错
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject
- 在另一个线程上发出 QObject 信号的正确方法?
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 在 QObject 方法中生成 QWidgets
- 我可以自动处理继承 QObject 的仅标头对象吗?
- QT 库 QObject::connect: 无法连接 (null)::done() 到 MainWindow::upd
- QObject::connect 有太多的参数
- 可以在 QObject::connect() C++中连接 QML 对象现有信号?