lambda捕获成员变量

时间:2015-11-26 08:01:36

标签: c++ lambda

要捕获对象中的成员数据,lambda需要捕获'这个'指针:

class A {
public:
    void func() {
       auto f = [this](){_b->do_something();};
       _c->run(f); // asynchronized method
    }
private:
    B* _b;
    C* _c;
};

有一个问题:当_c被_c调用时,A的对象可能会失败! _b->do_something();会成为未定义的行为吗?

2 个答案:

答案 0 :(得分:2)

使用shared_ptr,然后在lambda中捕获它。现在,当您创建A的实例时,您需要使用make_shared执行此操作。最好是从enable_shared_from_this继承然后你可以在lambda捕获中使用shared_from_this来强制A保持足够长的时间让lambda运行而不需要引用到其他地方的shared_ptr

你班级的第一部分看起来像这样:

class A : std::enable_shared_from_this<A> {
public:
    void func() {
       auto self = shared_from_this();
       auto f = [this, self](){_b.do_something();};
       _c->run(f); // asynchronized method
    }

答案 1 :(得分:0)

来自3.8对象生活

  
      
  1. [...]在对象的生命周期结束之后和存储之前   被占用的对象被重用或释放,任何引用的指针   对象将位于或位于的存储位置可能是   使用但仅限于有限的方式。 [...]该计划尚未定义   行为如果:
  2.         

    [...]

         

    5.2指针用于访问非静态数据成员或调用a   对象的非静态成员函数

所以是的,在被破坏的A中使用指向B的指针是UB。