// CSingleton单例对象发送信号与lamada函数连接
connect(CSingleton::GetInst(), &CSingleton::SigUpdate, [this](){ Update(); });
绑定的是一个函数,类似
void fun() {}
connect(CSingleton::GetInst(), &CSingleton::SigUpdate, &fun);
这种情况下,connect不认为它绑定类成员函数,认为只是绑定一个普通函数,所以CTestWnd实例析构时不会自动也无法disconnect,因为CTestWnd实例里里没有绑定关系。
[this](){ Update();} 这个lambda又用到了this指针,所以对象销毁后,this成了野指针,最后crash
connect(CSingleton::GetInst(), &CSingleton::SigUpdate, this, [this](){ Update(); });
第三个参数就是对象指针,传入这个参数后,它会保存绑定关系,所以CTestWnd实例会在析构时,主动解除绑定关系。
这个绑定关系实际上保存在一个全局类里面,CTestWnd只保存自己的那一份,解绑时,实际上也是调用的全局类方法。
5年前以前接触过一点qt
补充一下,lambda可以认为它是一个可拷贝实例,它的生命周期与变量类似。传给函数参数的lambda变量,一般会被拷贝,可以解释无法理解的问题
{
auto fun = [...]() {}
} // 出了这个作用域,lambda生命周期就结束了, [...]里 以传值 捕获的 变量会析构,传指针或引用的不会