【发布时间】:2013-06-27 15:21:17
【问题描述】:
我想注册一个回调,它可以将自己从其容器中移除。但是我发现捕获的变量似乎被清理了。代码如下:
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 以延迟其销毁:
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;
}
【问题讨论】:
-
您可能需要在此处添加更多详细信息,说明实际未按预期工作的内容。
-
“我发现捕获的变量似乎已被清理”是什么意思?