[英]lambda capture member variable by this
要捕获对象中的成员数据,lambda需要捕获“ this”指针:
class A {
public:
void func() {
auto f = [this](){_b->do_something();};
_c->run(f); // asynchronized method
}
private:
B* _b;
C* _c;
};
有一个问题:当_c调用f时,A的对象可能是虚构的! 会_b->do_something();
变成不确定的行为?
利用shared_ptr
,然后在lambda中捕获它。 现在,当您创建A
的实例时,您需要使用make_shared
来完成。 如果你继承这是最好enable_shared_from_this
,然后你可以使用shared_from_this
在lambda捕获迫使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
}
从3.8对象生命
- [...]在对象的生存期结束之后,在重新使用或释放对象所占用的存储空间之前,可以使用任何指向该对象将要或将要位于的存储位置的指针,但只能以有限的方式使用。 [...]该程序在以下情况下具有未定义的行为:
[...]
5.2指针用于访问对象的非静态数据成员或调用非静态成员函数
所以是的,在已破坏的A中使用指向B的指针是UB。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.