簡體   English   中英

Lambda捕獲QFile對象

[英]Lambda capture QFile object

我想在lambda函數中維護一個文件。 我可以在lambda之外對其進行處理,但是一旦我將其作為參考傳遞並要在下載后檢查其存在,我的應用程序就會在此行崩潰: if (workFile.exists() && !workFile.remove()) {

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.";
        }
    });
}

回溯:

在此處輸入圖片說明

為什么不起作用? 我應該如何正確捕獲QFile?

通過引用捕獲對象時,如果在對象的生存期結束后調用了lambda,則會得到一個懸空的引用。 您應始終確保在調用lambda時通過引用傳遞的對象仍然有效。

在您的示例中, QFile對象在實際調用lambda之前就超出范圍,這是因為函數完成后FileManager會發出onDownload ,lambda獲取對無效對象的引用,從而導致崩潰。

您可以通過在lambda中實例化另一個具有相同文件名的QFile實例(而不是捕獲舊的實例)來解決此問題,或者使用靜態替代方法(如果您只想檢查是否存在並刪除): QFile::exists()QFile::remove()

如果確實需要捕獲舊的QFile實例,則必須確保在調用lambda時,其生存期是有效的(可以通過使用new將其分配到堆上並在完成后自行delete它來實現)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM