簡體   English   中英

lambda捕獲成員變量由此

[英]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對象生命

  1. [...]在對象的生存期結束之后,在重新使用或釋放​​對象所占用的存儲空間之前,可以使用任何指向該對象將要或將要位於的存儲位置的指針,但只能以有限的方式使用。 [...]該程序在以下情況下具有未定義的行為:

[...]

5.2指針用於訪問對象的非靜態數據成員或調用非靜態成員函數

所以是的,在已破壞的A中使用指向B的指針是UB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM