2017-07-14 107 views
4

我正在向智能指針轉變,我試圖確保我正確使用它們。有很多問題涉及何時使用每個問題,但我無法找到有關獲得者的具體問題。這是unique_ptr的濫用嗎?

我有一個類擁有一個指針,我希望其他類能夠訪問該指針(在步驟中重構遺留代碼)。我想給這個類一個unique_ptr,因爲它只會擁有這個對象,但它們不能被複制。我應該返回對unique_ptr的引用,還是隻使用shared_ptr?

class B 
{ 
public: 
    doAction() {}; 
}; 

class A 
{ 
private: 
    std::unqiue_ptr<B> pointer; 

public: 
    std::unique_ptr<B>& GetPointer() 
    { 
     return pointer; 
    } 

}; 

a.GetPointer()->doAction(); 
+3

我個人使用原始指針或引用爲非擁有訪問。 (如果允許該值爲空,則使用指針;否則使用引用) – 0x5453

+3

這將允許調用者執行'a.GetPointer()。重置();'可能不完全是你想到的。 ''返回pointer.get();' –

回答

6

如果其他類需要存儲的指針和潛在的生活比你的A級長,使用shared_ptr

如果不是,並且您的B對象應該在破壞A時被破壞,則這是unique_ptr的完全有效使用。

正如在評論中指出的,這隻有在其他類也被允許改變你的指針時才成立。如果不是,則返回一個原始指針。

兩者之間的差異並不是關於誰有權訪問該類,而是關於誰負責銷燬引用對象。

5

如果代碼只需要通過unique_ptr訪問B對象,那麼最好是返回原始指針pointer.get();。請記住,原始指針並不壞,擁有原始指針。

+0

或者返回一個引用,這也表明沒有返回「所有權」:'B&GetBReference()'返回一個原始指針可能是最好的。 {return * pointer; }' – Matthias247

1

我應該返回一個對unique_ptr的引用,或者只是使用shared_ptr?

這要看情況。

還有別的東西需要擁有指針嗎?如果是,則使用共享所有權。如果您不需要共享所有權,那麼A可以是唯一所有者,因此unique_ptr是合適的。

但是在這種情況下,我會反而將對象引用(或原始指針,如果unique_ptr可能爲空)而不是unique_ptr。這封裝了所有權的控制,因此只能在成員函數內進行更改。如果你有一個函數返回對unique_ptr的引用,那麼你就沒有封裝,並且你可能會以簡單的名義將unique_ptr公開爲第一位。

0

返回一個原始指針或對被指向的對象的引用。當一個對象持有std::unique_ptr這表明所有權。意思是,持有指針的對象將分配,並且在它滿意時刪除分配的資源。

例如:

class Car { 
public: 
    Engine* getEngine() const { return engine_.get(); } 
private: 
    std::unique_ptr<Engine> engine_; 
} 

您可以要求汽車的可能可用的發動機,你應該總是假設它可能不存在,但你一定要永遠不會釋放它,它不是你的,它是由擁有汽車。