2015-11-23 33 views
3

我使用智能指針,並試圖總結我的頭周圍最好使用它盯着。我讀過大量的文章,但我很困惑在下面的例子中使用哪一個。我已經包含了shared_ptrunique_ptr例子來說明什麼,我試圖完成:shared_ptr的VS的unique_ptr使用類和兒童

class A 
    public: 
    A(); 
    private: 
    unique_ptr<B> ptrB; 

    unique_ptr<SomeObject> ptrUnique; 
    shared_ptr<SomeObject> ptrShared; 

A::A() 
{ 
    ptrB(new B()); 

    ptrUnique(new SomeObject()); 
    ptrB->PassUnique(ptrUnique); 

    ptrShared(new SomeObject()); 
    ptrB->PassShared(ptrShared); 
} 

class B: 
    pubic: 
    void PassUnique(unique_ptr<SomeObject> &ptr_unique); 
    void PassShared(weak_ptr<SomeObject> &ptr_weak); 
    void DoSomething(); 
    private: 
    unique_ptr<SomeObject> ptrUnique; 
    weak_ptr<SomeObject> ptrWeak; 

B::PassUnique(unique_ptr<SomeObject> &ptr_unique) 
{ 
    ptrUnique = ptr_unique; 
} 

B::PassShared(weak_ptr<SomeObject> &ptr_weak) 
{ 
    ptrWeak = ptr_weak; 
} 

B::DoSomething() 
{ 
    ptrUnique->SomeMethod(); 

    shared_ptr<SomeObject> ptr1 = ptrWeak.lock(); 
    ptr1->SomeMethod(); 
} 

SomeObject類可以是任何類。一個很好的例子是我從父類A傳遞的數據庫句柄,它最初是由多個類(如B)啓動的,並且從B到C(如果存在)。我的問題是,如果我傳遞一個unique_ptr作爲參考將設置例如ptrUnqiue = ptr_unique B:PassUnique創建一個副本,然後是不正確的?或者應該通過shared_ptr完成?這種理解與我的智能指針混淆,並希望澄清。

+0

你不能這樣做'ptrUnique = ptr_unique' ..所以你的問題似乎有點空洞。 http://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D – Default

+0

謝謝我不太確定使用情況。 – adviner

回答

1

那麼,這是一個有生之年的問題。你需要SomeObject以超越AB發送或正在使用這種情況之外嗎?你必須決定你的物體何時死亡。如果你認爲SomeObject只存在於這種情況下,我會建議A是所有者,因爲它分配資源,並且是舊的指向SomeObject的原始指針。我是這樣的:

class A 
    public: 
    A(); 
    private: 
    unique_ptr<B> ptrB; 

    unique_ptr<SomeObject> ptrUnique; 

A::A() 
{ 
    ptrB(new B()); 

    ptrUnique(new SomeObject()); 
    ptrB->PassUnique(*ptrUnique); 
} 

class B: 
    pubic: 
    void PassUnique(SomeObject& obj); 
    void DoSomething(); 
    private: 
    SomeObject* ptrUnique; 

B::PassUnique(SomeObject& obj) 
{ 
    ptrUnique = &obj; 
} 

B::DoSomething() 
{ 
    ptrUnique->SomeMethod(); 
} 

有作爲

ptrUnique = ptr_unique; 

沒有這樣的事情,如果你需要SomeObject使用這種結構的外資,然後用std::shared_ptr去像你這樣。您的std::shared_ptr代碼沒有錯誤。

+0

感謝您對示例的說明。是SomeObject將從發起並傳遞給B.也許從B到C,但發起人將永遠是一個 – adviner

+0

以往是否使用B :: PassUnique(的unique_ptr &ptr_unique)是一個好主意,而不是B :: PassUnique (SomeObject&obj)? – adviner

+0

我不會推薦它。爲什麼?因爲它不是const的,所以你的'PassUnique'函數可能是邪惡的,並且可以通過'reset'和'release'函數釋放指針。但傳遞一個'unique_ptr'作爲參考的用處很少,所以我會保持這個簡單並傳遞一個'observer_ptr',但是現在還沒有這樣的東西,所以解決方法是通過原始指針或通過引用傳遞像我的例子。 –

0

回答基本上是什麼將在A,B和/或C的指針的壽命可以把它看成範圍,[A ... A),[B ... b)和[C. ..C)。如果[B ... b]總是在[A ... a]之內並且[C ... c]總是在[B ... b]之內,他們就像俄羅斯娃娃的等級一樣, to-ptr是可以的。如果範圍重疊並且變化很大,所以你不能真正控制最後一個ptr將被銷燬的位置,並且對象將被刪除,你必須使用shared_ptr。

+0

再次閱讀該問題。 OP詢問有關特定問題 – Default

+0

感謝您幫助解決此問題 – adviner