这些年在Qt中踩下的lambda坑

坑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关联的信号或槽函数.

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。