【发布时间】:2018-06-06 03:08:15
【问题描述】:
我正在测试一些关于闭包的特性,但我遇到了一些问题,这里有一些代码,有一个 3 个 lambda 函数的向量,这些函数捕获内部的局部变量 BuildFns ,所有 i 的内存位置都是相同的,但是,只有来自主函数的第一次调用实际输出 3,当我们在 main 中调用它们时,我们是否应该期望向量输出 3 中的所有函数?
#include <iostream>
#include <vector>
using namespace std;
auto BuildFns() {
vector<function<void()>> vec;
for (int i = 0; i < 3; i++) {
cout << &i << '\n';
vec.push_back([&i]() {
cout << i << endl;
cout << &i << '\n';
});
}
return vec;
}
auto main() -> int {
auto vec = BuildFns();
vec[0]();
vec[1]();
vec[2]();
}
输出:
0x7ffeedfa25c8
0x7ffeedfa25c8
0x7ffeedfa25c8
3
0x7ffeedfa25c8
-1581316512 // what's wrong with this i? isn't it contained in the closure environment and can't be written if it's still been accessed?
0x7ffeedfa25c8
-1581316512
0x7ffeedfa25c8
预期:
0xaddress_of_i
0xaddress_of_i
0xaddress_of_i
3
0xaddress_of_i
3
0xaddress_of_i
3
0xaddress_of_i
【问题讨论】:
-
变量
i仅在循环内是局部的。一旦循环完成,变量就会超出范围并且它的生命周期结束,并且任何指向它的指针或引用都将悬空且无效。使用该引用会导致undefined behavior。 -
@Someprogrammerdude 好的,我认为关闭会延长我的寿命