gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:29:42 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com