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 本身的生命周期一样长。
在下面的代码中,我认为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 本身的生命周期一样长。