qt中lambda使用的问题。

chinsanyl 2017-04-28 05:17:00

QString filename("/tmp/aa");
QFile *tagfile = new QFile(filename);

_pUpdateTagFileWatchter = new QFileSystemWatcher(this);
_pUpdateTagFileWatchter->addPath("/tmp");
connect(_pUpdateTagFileWatchter,&QFileSystemWatcher::destroyed,this,&Widget::aaa);
QObject::connect(_pUpdateTagFileWatchter,&QFileSystemWatcher::directoryChanged,this,[=]() { //不崩溃
// QObject::connect(_pUpdateTagFileWatchter,&QFileSystemWatcher::directoryChanged,this,[&]() { //崩溃
qDebug()<<"1111";
if(tagfile->exists()){
qDebug()<<"find CLIENT_UPDATE_TAG_FILE, client continue to start.";
_pUpdateTagFileWatchter->deleteLater();
_pUpdateTagFileWatchter = NULL;
}else{
qDebug()<<"no CLIENT_UPDATE_TAG_FILE, waiting.";
}
});


监控一个目录,是否生成一个文件。目录的文件发生改变的时候:
我使用QObject::connect(_pUpdateTagFileWatchter,&QFileSystemWatcher::directoryChanged,this,[=]() { 没有问题
使用 QObject::connect(_pUpdateTagFileWatchter,&QFileSystemWatcher::directoryChanged,this,[&]() { 程序打印出“1111”,之后直接崩溃。

求教!!

[capture](parameters)mutable->return-type{statement}
1.[var]表示值传递方式捕捉变量var;
2.[=]表示值传递方式捕捉所有父作用域的变量(包括this);
3.[&var]表示引用传递捕捉变量var;
4.[&]表示引用传递方式捕捉所有父作用域的变量(包括this);
5.[this]表示值传递方式捕捉当前的this指针。
...全文
1231 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gushansanren 2018-09-20
  • 打赏
  • 举报
回复
[&]是传引用,在函数执行完以后,QFile *tagfile 这个对象就已经释放了, 这个引用就是无效的了,lambda表达式执行时引用的内存空间数据已经被覆盖了。肯定就崩溃了。

[=]是传值,将tagfile的值传给lambda表达式,在函数执行完成后,new创建的对象没释放,传值指向的地址空间还是对的,当然能执行不会崩溃。
skyhyko 2018-09-14
  • 打赏
  • 举报
回复
lz你好,最近我刚开始学习c++与qt,我也遇到了这个问题,刚才qdebug了一番,发现问题的原因了,当在lambda表达式里qdebug查看this和tagfile地址时,你会发现this地址是一样的,但是tagfile的地址和在lambda表达式外的tagfile不一样,所以导致指针错误引发了崩溃。 因为你的tagfile是动态创建的,如果你的tagfile在.h头文件里提前声明,那么程序就不会崩溃,如果不声明,但是还想用qtagfile,那么捕获列表改为[&,tagfile]就可以了
尘中远 2017-05-09
  • 打赏
  • 举报
回复
如果用引用捕获,QFile *tagfile是捕获到了指针的引用,这个时候,你lambda里的tagfile相当于是外面tagfile的指针,等这个函数一完成就释放了
chinsanyl 2017-04-28
  • 打赏
  • 举报
回复
是不是因为, QFile *tagfile 为局部变量,在加入lambda函数的时候,以及被释放了。 如果使用应用,而不是拷贝的话,就会使用一个已经被释放的局部变量,然后崩溃???

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧