Qt5 slot lambda 为什么第一次调用lambda时捕获的局部变量是随机的

Qt5 slot lambda why captured local variable is random for the first time lambda is called

在下面的代码中,我认为p2应该打印10。但实际上它打印的是随机值。我开始理解为什么它不是 10,有以下 (1)-(3) thoughts.

{
    int m = 10; // local var m
    qDebug() << "m0: " << &m;
    connect(btn2, &QPushButton::clicked, this, [&]() { qDebug() << "m2: " << &m; qDebug() << "p2 " << m; m = 20; qDebug() << "p22 " << m; }); // captured var m
} 

输出:

m0:  0x8ff8ac
p0  10
m2:  0x8ff8ac
p2  11974204
p22  20
m2:  0x8ff8ac
p2  20
p22  20

(1)。第一次调用 lambda 时,其捕获的 var m 具有随机值。我想这可能是因为local var m是一个局部变量,而且是在栈内存上,在}之后释放,之后是随机的。

(2)。在捕获的 m 在 lambda 内部赋值为 20 后,当它被第二次调用时, m 仍然是 20。这与我在(1)中的想法相反,因为当退出 lambda 函数时, m 应该释放内存,然后再次随机取值。

(3).[&] 使lambda 可以访问已释放的内存,这不是很危险吗?

基于我的上述想法,我的问题是为什么捕获的 m 不是 10(p2 打印的内容)?为什么可以访问和修改已释放的内存,这不是很危险吗?为什么第二次访问 lambda,m 不是随机的?

因为您通过引用捕获了它。

函数结束后,其所有局部变量的生命周期也会结束。局部变量不复存在。对它们的任何引用或指针都将变得无效。使用此类引用或取消引用此类指针将导致未定义的行为

通过引用捕获的所有变量的生命周期必须至少与 lambda 本身的生命周期一样长。