C++ 从lambda中的容器中取出self
我想注册一个回调,该回调可能会从其容器中移除自身。但我发现捕获的变量似乎被清除了。代码如下所示:C++ 从lambda中的容器中取出self,c++,c++11,lambda,C++,C++11,Lambda,我想注册一个回调,该回调可能会从其容器中移除自身。但我发现捕获的变量似乎被清除了。代码如下所示: 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::unordere
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;
}
A类{
int val_;
公众:
A(int val):val(val{}
void foo(){
std::cout您的代码具有未定义的行为,因为您是在从容器中删除闭包后访问闭包的。您应该在使用闭包后从容器中删除它:
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;
}
A类{
int val_;
公众:
A(int val):val(val{}
void foo(){
std::您可能需要在这里添加更多的细节,说明什么实际上没有按照您的预期工作。您所说的“我发现捕获的变量似乎已被清理”是什么意思?谢谢!但是我必须在lambda的开头放上erase
。有没有办法禁用容器中的这个函数的索引,直到我可以在lambda的末尾删除它为止?@user2134183:在调用erase
之前,您可以将相关数据保存到局部变量中。重要的是不要访问删除闭包后捕获的变量。谢谢!我找到了另一种修复方法!我将容器中的std::function
对象移动到lambda中,并从容器中移除空对象。只需在lambda的开头添加std::function self=std::move(容器[func_index]);
!
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;
}