要捕获对象中的成员数据,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();
会成为未定义的行为吗?
答案 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对象生活
- [...]在对象的生命周期结束之后和存储之前 被占用的对象被重用或释放,任何引用的指针 对象将位于或位于的存储位置可能是 使用但仅限于有限的方式。 [...]该计划尚未定义 行为如果:
醇>[...]
5.2指针用于访问非静态数据成员或调用a 对象的非静态成员函数
所以是的,在被破坏的A中使用指向B的指针是UB。