坑1: 类内关联Lambda
例如在类A的构造函数中, 关联对象B的name属性变化, 然后使用Lambda函数将变化后name的值设置到类A的name属性中. 大概代码如下:
class A : public QObject {
Q_OBJECT
public:
A(B *b) : m_b(b) {
connnect(&b, &B::name_changed, [=] { m_name = m_b.name});
}
private:
B *m_b;
QString m_name;
};
在这个例子中, A对象销毁之后, 关联并没有销毁, 所以当对象b的name属性改变时, 还是会调用到该lambda函数, 但该lambda中的m_name已经销毁了, 所以导致访问非法内存,程序异常.
这里的重点是既然A对象销毁了,那么关联为什么没有跟着销毁呢, 这是因为这个关联其实跟A对象是没有什么关系, 可以看成是个全局的的关联, 如果想跟A对象有关系,connect语句可以传统方式(即用SIGNAL,SLOT声明), 或写成以下方式:
connnect(&b, &B::name_changed, this, [=] { m_name = m_b.name});
这样在销毁A对象时,就会释放A关联的信号或槽函数.