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 {
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;
}