C++ Qt连接中的Lambda表达式

C++ Qt连接中的Lambda表达式,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 wor

我有以下功能,用户每次单击按钮时都会调用该功能:

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连接,使用了名为
上下文的第三个参数。在您的例子中是
这个
指针。因此,当
处于活动状态时,连接处于活动状态。创建lambda连接时,lambda对象作为一个整体移动到连接管理器。当你们断开和信号的连接时,lambda对象应该是死的(正如我所建议的)。也许以后会被删除。因此,我建议插入
disconnect
,作为lambda中的最后一条指令。但是,
仍处于活动状态。 A还建议您使用另一种机制来调用异步任务,而不是连接/断开同一对象中的信号!
例如,一根线。或者调用QTimer::singleShot。我看不出在什么情况下会为Qt中的lambda连接发出授权信号

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

捕获lambda就像一个函子-一个带有成员变量和重载的
操作符()()
的结构。如果信号处理程序lambda断开连接,则会删除结构实例及其所有成员变量。仅供参考:捕获lambda就像一个函子-一个具有成员变量和重载的
运算符()的结构。如果信号处理程序lambda断开连接,则会删除结构实例及其所有成员变量。仅供参考:谢谢您的回答。
authorized
信号确实是从另一个线程发出的。怎么可能呢?很明显,
这个
物体发出信号。
这个
从另一个线程发出信号,而
这个
对象调用当前线程中的插槽,这怎么会发生呢?一个
QObject
不能在同一时刻属于多个线程。实际上,该信号是从一个回调函数(它是Foo的成员)发出的,并且该回调在另一个线程中执行。谢谢您的回答。
authorized
信号确实是从另一个线程发出的。怎么可能呢?很明显,
这个
物体发出信号。
这个
从另一个线程发出信号,而
这个
对象调用当前线程中的插槽,这怎么会发生呢?一个
QObject
不能在同一时刻属于多个线程。实际上,该信号是从一个回调函数(Foo的成员)发出的,该回调函数在另一个线程中执行。