2017-09-08 33 views
0

我有以下一些類似於:是對象X的毀滅期間對象X仍是有效的weak_ptr

class A { 
    std::weak_ptr<B> r; 
    A (std::weak_ptr<B> x) : r(x) {} 

    ~A() { 
    r.lock(); 
    } 
}; 


class B : std::enable_shared_from_this<B> { 
    std::shared_ptr<A> r; 
    foo() { 
    r = std::make_shared<A>(shared_from_this()); 
    } 
}; 

在B的破壞,〜A()被調用;但它想要回擊被破壞的對象。 忽略這個問題的設計問題是定義的行爲,還是依賴於編譯器?

+0

您能否提供使用示例?一個問題是:一個名爲a的實例獲得了b b的一個實例,並且b對這個a具有弱引用? – Theforgotten

+0

銷燬順序是按照與構造相反的順序完成的,所以'B'仍然是*'valid'*,但是在'r'之後訪問成員將是UB。 – Jarod42

+0

@ tobi303對不起 - 挺對的;問題更新 – UKMonkey

回答

3

表達式r.lock()將失敗(即返回一個空的shared_ptr)。

的weak_ptr的是有效的,但shared_ptr的已經破壞了B.

事件的順序將是:

shared_ptr<B>::~shared_ptr() 
<strong reference count reduced to 0, destruction process begins> 
<shared_ptr<B> is now empty> 
    ~B() 
    shared_ptr<A>::~shared_ptr() 
    ~A() 
    weak_ptr<B>::lock -> returns shared_ptr<B>(nullptr) 

有次優設計的強烈氣味這裏。正式寫出要求可能是一個好主意。