C++:无法在 lambda 中捕获 "this" 上下文 2 次
C++: Cannot capture "this" context 2 times in lambdas
下面是重现问题的最小代码:
std::vector<std::function<bool()>> injections;
struct Obj {
void load() {
injections.push_back([&] {
std::cout << ++counter << std::endl;
injections.push_back([&] {
std::cout << ++counter << std::endl;
return true;
});
// std::cout << ++counter << std::endl;
return true;
});
}
int counter = 0;
};
int main() {
Obj obj;
obj.load();
while(true)
for(auto i = 0; i < injections.size(); i++) {
auto pop = injections[i]();
if(pop)
injections.erase(injections.begin() + i--);
}
}
运行 正是这样,一切正常,但取消注释注释行,它崩溃了。问题是在推送第二个 lambda 之后,this
指向一些垃圾,然后 ++counter
抛出。我希望第一个 lambda 通过引用捕获成员,这些成员在结束 load()
后不会超出范围,这正是发生的情况。对于第二个 lambda,我希望通过引用捕获引用,使 counter
可用,这又是使用注释错误行时发生的情况。看起来 lambda 的构造使其之后的所有内容都无效。这是什么原因和一些解决方案?
当您在 injections
中插入内容时,之前的 std::function<bool()>
可能会被移动(并被破坏)。
因此 injections.push_back
之后的代码不应再使用 captures/members。
主要相当于usage of delete this;
一个方法中的
下面是重现问题的最小代码:
std::vector<std::function<bool()>> injections;
struct Obj {
void load() {
injections.push_back([&] {
std::cout << ++counter << std::endl;
injections.push_back([&] {
std::cout << ++counter << std::endl;
return true;
});
// std::cout << ++counter << std::endl;
return true;
});
}
int counter = 0;
};
int main() {
Obj obj;
obj.load();
while(true)
for(auto i = 0; i < injections.size(); i++) {
auto pop = injections[i]();
if(pop)
injections.erase(injections.begin() + i--);
}
}
运行 正是这样,一切正常,但取消注释注释行,它崩溃了。问题是在推送第二个 lambda 之后,this
指向一些垃圾,然后 ++counter
抛出。我希望第一个 lambda 通过引用捕获成员,这些成员在结束 load()
后不会超出范围,这正是发生的情况。对于第二个 lambda,我希望通过引用捕获引用,使 counter
可用,这又是使用注释错误行时发生的情况。看起来 lambda 的构造使其之后的所有内容都无效。这是什么原因和一些解决方案?
当您在 injections
中插入内容时,之前的 std::function<bool()>
可能会被移动(并被破坏)。
因此 injections.push_back
之后的代码不应再使用 captures/members。
主要相当于usage of delete this;
一个方法中的