繁体   English   中英

使用指向QObject的原始指针作为信号参数是否安全?

[英]Is it safe to use a raw pointer to a QObject as a signal argument?

qt doc说:

声明函数将QPointer作为参数是没有多大价值的; 只需使用普通指针。 在随时间存储指针时使用QPointer。

但是使用指向QObject的普通指针作为信号参数是否安全?

如果信号连接到具有Qt::QueuedConnection的插槽并且在调用插槽之前参数对象被解除,会发生什么?

class MyObject : public QObject
{
  Q_OBJECT
public:
  explicit MyObject(QObject *parent = nullptr) : QObject(parent) {}

signals:
  void mySignal_A(QObject *parameter);
  void mySignal_B(QPointer<QObject> parameter);
};

如果指向的对象可能在您已经怀疑的同时被删除,则将指针作为参数传递到排队的信号/插槽连接中是不安全的。 我认为文档是指同步函数调用(也适用于直接连接)。

您可以使用QPointer或QSharedPointer / QWeakPointer(或C ++ 11的std :: shared_ptr / std :: weak_ptr)。 如果QObject没有父代,则只能使用共享指针。

更好的是,尽可能避免绕过QObjects。

它的行为与使用无效指针调用普通成员完全相同。 如果您在插槽中使用此QObject,那么您将获得UB - 但是您可以使用QWeakPointer而不是原始QObject指针来控制您的QObject是否在另一个上下文中被销毁

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM