- A+
所属分类:Qt经验集
- void EDialog::clicked()
- {
- Q_D(EDialog);
- connect(closeButton,&QPushButton::clicked,this,[&](){ //&需要改为=
- d->close();
- });
- }
代码中,Q_D(EDialog)产生的d指针其实是局部变量,这句代码的意思是closeButton的点击信号关联到了一个lambda函数,当closeButton点击时,执行close函数。EDialog::clicked() 函数执行完毕后,d指针也就被销毁了,当closeButton点击时,运行到d->close(),d指针已经销毁掉,但是因为用了取&符号,所以此时的d指针一样被置为null,也就导致崩溃;应该改为=,这样d指针其实是一个地址拷贝,虽然外层的d指针被销毁了,但是因为是指针的拷贝,所以依然可以指向正确的内存空间
lambda表达式原理讲解
lambda表达式也叫做lambda函数,实际就是一个匿名函数,函数体就是{}花括号中的部分,使用lambda编程也叫做函数式编程。lambda函数和外部函数可以看成是两个不相关的函数,函数内部的局部变量的生命周期自然也就被控制在各个函数中,当需要两者之间传递变量时,可以通过&或者=的方式进行传递,&传递其实就是地址传递,要求这个变量在两个函数中的生命周期中都存在,一般就是全局变量或者成员变量,这个变量一般不是局部变量,生命周期要在函数级别之上;=传递就是值传递,会将变量复制一份,浅拷贝,这时候就需要注意是否有需要深拷贝的指针变量,还需要注意值传递的变量应该尽可能小,值拷贝执行效率不如传地址效率高。