c++ - Lambda 捕获 QFile 对象

标签 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?

最佳答案

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

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

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

如果你真的需要捕获旧的 QFile 实例,你必须确保在调用 lambda 时它的生命周期是有效的(你可以通过使用 在堆上分配它来做到这一点新建 并在完成后自行删除

关于c++ - Lambda 捕获 QFile 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40058007/

相关文章:

c# - Visual Studio 2012 - 导出模板自动化

c++ - 什么是 id 表达式?

c# - ShowDialog() 不在主窗体之上显示窗体

c++ - 为什么使用 GCC 在 x86 上整数溢出会导致无限循环?

c++ - Qt 创建者 - `multiple definition of qMain` 错误

c++ - 图标点击Qt QTreeWidget

c++ - 根据多个信号运行一个函数

asp.net - 如何在调试 Web 项目的同时运行测试?

c++ - 使用系统(char * 命令)ssh 远程登录到服务器,并执行命令?

c++ - 链表复制/移动语义 C++