2016-10-15 59 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自己荷蘭國際集團它時,你是完成)。