2013-10-02 88 views
8

我想將原始指針成員換成某個智能指針,以防止在開發類中刪除。指針下的對象的所有者在類之外。所以,看起來像boost::shared_ptrstd::auto_ptr不適合。以下是一個簡化示例:從原始指針創建weak_ptr <>

class Foo { 
    boost::weak_ptr<Bar> m_bar; 
public: 
    void setBar(const Bar *bar) { // bar created on heap 
    m_bar = bar;    // naturally compilation error 
    } 
}; 

當然,它會導致編譯錯誤。從原始指針(如果存在)初始化weak_ptr的正確方法是什麼?

+0

可能重複轉換](http://stackoverflow.com/questions/17522020/shared-ptr-weak-ptr-conversions) –

+1

如果你想防止刪除你的類中的那個指針,那麼不要對它調用'delete',並且不提供將指針公開給客戶端的訪問器函數。 'weak_ptr'意味着擁有'shared_ptr'的對象的非擁有視圖。如果你能以某種方式將指針填充到'weak_ptr'中,它不知道指針是否過期,也不會阻止我在類中調用'delete m_bar.lock()。get();'。你永遠無法使所有事情都百分之百白癡。 – Praetorian

回答

10

你不能這樣做,你只能創建一個weak_ptr出shared_ptr或另一個weak_ptr。 所以這個想法是,指針的擁有者擁有一個shared_ptr而不是一個原始指針,並且一切都應該沒問題。

1

傳遞共享指針而不是原始指針,並從該共享指針創建弱指針。如果指針的所有者不在類中,這真的是唯一的方法。

4

弱指針的目的是如果它已被刪除,將無法使用原始指針。但是,如果您有一個原始指針,則弱指針無法知道它已被刪除。相反,你必須擁有一個shared_ptr的「擁有」原始指針的地方。然後你可以創建一個引用shared_ptr的weak_ptr。

當shared_ptr超出範圍並且是最後一個「強」智能指針時,它會自動刪除原始指針。然後,當你試圖鎖定weak_ptr時,它會看到沒有「強」指針,因此該對象不存在。

2

一切你所說似乎是完全合理的,除了一兩件事:

void setBar(const Bar *bar) 

這不應該採取原始指針。如果你有一些令人信服的論點,它應該是理想的weak_ptr,或者可能是shared_ptr

有問題的對象的實際所有者應該構造weak_ptr,並且與此一起調用setBar。這保留了所有權語義。看起來你正在做的是讓擁有的對象獲取一個原始指針並將其傳遞給setBar。這會在對象的所有權上產生語義鴻溝。

5

要做到這一點的唯一方法是通過獲取擁有該指針的shared_ptrweak_ptr,否則weak_ptr無法找到現有所有者以便與其共享所有權。

從已經由另一shared_ptr擁有的原始指針得到shared_ptr的唯一方法是,如果Barenable_shared_from_this<Bar>派生,那麼你可以做[共享\ _ptr和薄弱\ _ptr的

m_bar = bar->shared_from_this(); 
相關問題