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);
};
答案 0 :(得分:3)
如果指向的对象可能会被删除而您已经怀疑,则将指针作为参数传递到排队的信号/插槽连接中是不安全的。我认为文档是指同步函数调用(也适用于直接连接)。
您可以使用QPointer或QSharedPointer / QWeakPointer(或C ++ 11的std :: shared_ptr / std :: weak_ptr)。如果QObject没有父对象,则只能使用共享指针。
更好的是,尽可能避免绕过QObject。
答案 1 :(得分:0)
它的行为与使用无效指针调用普通成员完全相同。如果您在插槽中使用此QObject,那么您将获得UB - 但是您可以使用QWeakPointer而不是原始QObject指针来控制您的QObject是否在另一个上下文中被销毁