lambda表达式一运行就崩溃 Qt经验集 定位错误 QtShare Qt深入学习

  • A+
所属分类:Qt经验集
  1. void EDialog::clicked()
  2. {
  3.     Q_D(EDialog);
  4.     connect(closeButton,&QPushButton::clicked,this,[&](){ //&需要改为=
  5.             d->close();
  6.     });
  7. }

代码中,Q_D(EDialog)产生的d指针其实是局部变量,这句代码的意思是closeButton的点击信号关联到了一个lambda函数,当closeButton点击时,执行close函数。EDialog::clicked() 函数执行完毕后,d指针也就被销毁了,当closeButton点击时,运行到d->close(),d指针已经销毁掉,但是因为用了取&符号,所以此时的d指针一样被置为null,也就导致崩溃;应该改为=,这样d指针其实是一个地址拷贝,虽然外层的d指针被销毁了,但是因为是指针的拷贝,所以依然可以指向正确的内存空间

lambda表达式原理讲解

lambda表达式也叫做lambda函数,实际就是一个匿名函数,函数体就是{}花括号中的部分,使用lambda编程也叫做函数式编程。lambda函数和外部函数可以看成是两个不相关的函数,函数内部的局部变量的生命周期自然也就被控制在各个函数中,当需要两者之间传递变量时,可以通过&或者=的方式进行传递,&传递其实就是地址传递,要求这个变量在两个函数中的生命周期中都存在,一般就是全局变量或者成员变量,这个变量一般不是局部变量,生命周期要在函数级别之上;=传递就是值传递,会将变量复制一份,浅拷贝,这时候就需要注意是否有需要深拷贝的指针变量,还需要注意值传递的变量应该尽可能小,值拷贝执行效率不如传地址效率高。

 

Qt大课堂-QtShare

发表评论

您必须登录才能发表评论!