c++ - Qt连接中的Lambda表达式

标签 c++ qt lambda

我有以下每次用户单击按钮时都会调用的函数:

void Foo::onCommand1Clicked(int index)
{
    connect(this, &Foo::authorized, this, [=]() {

        // avoid multiple connections 
        QObject::disconnect(this, &Foo::authorized, this, nullptr);

        // do work based on "index" captured by value ( or other parameters in real code )
        this->processCommand1(index);
        
        // ..

       
        }
    });
}
现在,如果命令是“授权的”(信号是异步发出的,但也可能根本不发出),则将执行包含命令逻辑的lambda。
此外,在命令待批准时,该按钮被禁用(阻止调用该函数)
我的问题是关于连接到信号的lambda,尤其是通过值捕获的参数:这些参数最终会从内存中释放吗?还是每次连接完成(即单击按钮)它们都会累积到内存堆栈中?
更一般而言,此代码中是否存在任何类型的“内存泄漏”或“连续增长的堆栈”?
谢谢。

最佳答案

对于Qt中的lambda连接,使用第三个参数context。您的情况是this指针。因此,在this处于 Activity 状态时,连接处于 Activity 状态。创建lambda连接时,lambda对象将作为一个整体对象移动到连接管理器。当您断开信号连接时,lambda对象应该死了(我建议)。也许以后再删除。因此,我建议将disconnect插入为lambda中的最后一条指令。但是,this仍然有效。
还建议您使用另一种机制来调用异步任务,而不是连接/断开同一对象中的信号!
例如,一个线程。或调用QTimer::singleShot。我看不到在什么情况下会发出授权信号

关于c++ - Qt连接中的Lambda表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62772084/

相关文章:

c++ - 是否可以让现有的 C++ 代码与 Qt 一起工作?

c++ - 我如何在我的 C++ 代码中创建 QML Canvas 并在其上附加视频?比如 Java Canvas 我可以

java - 这是 Function 接口(interface)的正确用法吗?

c# - 如何构建 Fluent Nested Guard API

qt - QML ListView、SwipeView 等 - 避免与其他 UI 组件重叠

c# - Lambda/LINQ 查找多个多对多关系 SQL 表之间的关系

c++ - 传递对象和面向对象的设计最佳实践

c++ - 模板类中模板化成员函数的定义 (C++)

c++ - 使用 std::fill 填充多维数组的安全方法是什么?

c++ - 数组的交换函数