从lambda中的容器中移除自我 [英] Remove self from the container in the lambda
本文介绍了从lambda中的容器中移除自我的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想注册一个回调,该回调可能会将其从其容器中删除.但是我发现捕获的变量似乎已清除.像这样的代码:
I want to register a callback that may remove itself from its container. But I found the captured variables seem to be cleaned up. the code like this:
class A {
int val_;
public:
A(int val) : val_(val) {}
void foo() {
std::cout << val_ << std::endl;
}
};
int main()
{
const int func_index = 1;
std::unordered_map<int, std::function<void(void)>> container;
A a(10);
container.insert(std::make_pair(func_index, [&container, func_index, &a] () {
container.erase(func_index);
for (int i = 0; i < 10; i++) {
a.foo();
}
}));
container[func_index]();
return 0;
}
解决方案,将std :: function对象移到lambda中以延迟其破坏:
the solution, move the std::function object into the lambda to delay its destruction:
class A {
int val_;
public:
A(int val) : val_(val) {}
void foo() {
std::cout << val_ << std::endl;
}
};
int main()
{
const int func_index = 1;
std::unordered_map<int, std::function<void(void)>> container;
A a(10);
container.insert(std::make_pair(func_index, [&container, func_index, &a] () {
std::function<void(void)> self = std::move(container[func_index]);
container.erase(func_index);
for (int i = 0; i < 10; i++) {
a.foo();
}
}));
container[func_index]();
return 0;
}
推荐答案
您的代码具有未定义的行为,因为您是在从容器中删除闭包后访问闭包的.在使用容器后,应将其从容器 中移除:
Your code has undefined behaviour, since you are accessing the closure after deleting it from the container. You should remove the closure from the container after doing work with it:
class A {
int val_;
public:
A(int val) : val_(val) {}
void foo() {
std::cout << val_ << std::endl;
}
};
int main()
{
const int func_index = 1;
std::unordered_map<int, std::function<void(void)>> container;
A a(10);
container.insert(std::make_pair(func_index, [&container, func_index, &a] () {
for (int i = 0; i < 10; i++) {
a.foo();
}
container.erase(func_index);
}));
container[func_index]();
return 0;
}
这篇关于从lambda中的容器中移除自我的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文