Qt 连接:使用 Lambda 表达式重置传递的 int 变量(奇怪)
Posted
技术标签:
【中文标题】Qt 连接:使用 Lambda 表达式重置传递的 int 变量(奇怪)【英文标题】:Qt Connections: Using Lambda Expression Resets Passed int Variable (Weird) 【发布时间】:2019-07-31 16:30:08 【问题描述】:考虑以下代码:
int counter = 0;
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, [this, &counter]() mutable
counter++;
qDebug() << counter;
);
timer->start(500);
预期:
1
2
3
4
...
输出:
32766 (a random number)
...
这里有一些未定义的东西吗?我找不到有关此效果的任何信息。
【问题讨论】:
捕获对局部变量的引用。一旦该局部变量死亡(因为您离开了定义它的范围),您就会有一个悬空引用。 这就是解决方案!在将“counter”变成类成员变量后,它就永远不会死,也不会再有悬空引用。谢谢! 【参考方案1】:[]
中的&counter
表示您正在 lambda 中通过引用捕获counter
。
如果变量int counter
已经超出范围(因为局部变量不会这样做),那么这意味着您有一个悬空引用;使用它是未定义的行为。
解决此问题的简单方法是按值捕获计数器 -- [this, counter]
而不是 [this, &counter]
。然后 lambda 将拥有自己的 counter
状态副本。由于它是可变的,因此它有权编辑自己的状态。
【讨论】:
以上是关于Qt 连接:使用 Lambda 表达式重置传递的 int 变量(奇怪)的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda 中的 PyMySql - 对等点重置连接
Qt5中的lambda表达式和使用lambda来写connect