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的成员)发出的,该回调函数在另一个线程中执行。