2016-10-15 25 views
0

我想维护一个lambda函数内的文件。我可以在lambda之外对其进行处理,但只要将它作为参考传递并希望在下载它之后检查它的存在,我的应用程序就崩溃在此行上:if (workFile.exists() && !workFile.remove()) {Lambda capture QFile对象

QFile workFile("path/to/file.bat"); 

[..] 

if (!workFile.exists()) { 
    [..] download file & such 
    QObject::connect(&mng, &FileManager::onDownload, this, [=, &workFile] (const QString& name) { 
     if (workFile.exists() && !workFile.remove()) { 
      qDebug() << "File was not downloaded correctly."; 
     } 
    }); 
} 

回溯:

enter image description here

为什么不工作?我应该如何正确捕获QFile?

+0

@Mike良好的抓住,发布它作为答案! – Rusco

回答

1

通过引用捕获对象时,如果在对象的生命周期结束后调用lambda,则会得到一个悬挂引用。在调用lambda时,应始终确保通过引用传递的对象仍然有效。

在您的例子中,QFile对象超出范围的拉姆达实际上是调用之前,出现这种情况是因为您的FileManager发出onDownload你的函数结束后,在lambda获取到一个无效的对象的引用,你会得到一个崩溃。

您可以通过使用相同的文件名实例化另一个QFile实例拉姆达内(而不是捕捉旧)解决这个问题,或者使用静态的替代品(如果你只是要检查是否存在并删除):QFile::exists()QFile::remove()

如果你真的需要捕捉老QFile情况下,你必须确保它的寿命是有效的拉姆达被调用时(你可以做到这一点通过使用new在堆中分配,并delete自己荷兰国际集团它时,你是完成)。