Lambda捕获QFile对象

时间:2016-10-15 10:40:28

标签: c++ qt visual-studio-2012 lambda

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

回溯:

enter image description here

为什么不起作用?我该如何正确捕获QFile?

1 个答案:

答案 0 :(得分:1)

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

在您的示例中,QFile对象在实际调用lambda之前超出范围,这是因为您的FileManager在函数完成后发出onDownload,lambda得到了引用无效对象,然后崩溃。

您可以通过在lambda中实例化具有相同文件名的另一个QFile实例来解决此问题(而不是捕获旧的实例),或者使用静态替代(如果您只想检查是否存在并删除): QFile::exists()QFile::remove()

如果你真的需要捕获旧的QFile实例,你必须确保在调用lambda时它的生命周期是有效的(你可以通过使用new在堆上分配它来实现它。完成后自己delete