Remove self from the container in the lambda

前端 未结 1 1436
走了就别回头了
走了就别回头了 2021-01-23 06:19

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 {
         


        
相关标签:
1条回答
  • 2021-01-23 06:27

    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;
    }
    
    0 讨论(0)
提交回复
热议问题