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

时间:2016-01-04 10:03:05

标签: c++ qt pointers qt5

qt doc说:

  

声明将QPointer作为a的函数没什么价值   参数;只需使用普通指针。在您使用时使用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);
};

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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