2014-03-07 61 views
0

也就是說,如果我不使用拷貝構造函數,賦值運算符,或移動構造等std :: shared_ptrs是否知道對方?

int* number = new int(); 
auto ptr1 = std::shared_ptr<int>(number); 
auto ptr2 = std::shared_ptr<int>(number); 

會不會有兩份強有力的推薦?

+2

該代碼是一個問題的事實是'enable_shared_from_this'的全部原因。 – bames53

+0

從我的理解中,share_from_this()不能在對象的構造函數中調用。這使得它非常沒用。 – Ben

回答

1

是會有兩個強引用,那裏有所有的共享指針,它看起來最多見,如果你試圖掩蓋的指針已經被其他智能指針覆蓋的沒有全球性的記錄。 (你自己做這樣的事情不是不可能的,但它不是你應該做的事情)

智能指針創建它自己的引用計數器,在你的情況下,會有兩個單獨的指針跟蹤相同的指針。

因此,無論智能指針可以刪除的內容沒有意識到的事實,這也是在其它智能指針舉行。

+0

好的,這正是我想知道的。謝謝。另外,這意味着原始的「this」指針不安全地傳遞給弱指針嗎? – Ben

+0

那麼,你應該只是從共享指針創建弱指針,不確定如果沒有共享指針的實例,最終如何製作一個弱指針呢? – Profan

+0

是的,我也不是。沒關係。 – Ben

0

您的代碼要求崩潰!

你不能指向同一個實際物體的兩個智能指針,因爲兩者會嘗試調用它的析構函數時,引用計數器變爲0

所以釋放內存,如果你想有兩個智能指針指向相同的對象必須執行:

auto ptr1 = make_shared<int>(10); 
auto ptr2 = ptr1; 
3

根據標準,use_count()返回1立即shared_ptr之後從原始指針(§20.7.2.2.1/ 5)構成。我們可以從中推斷出,即使原始指針是相同的,從原始指針構造的兩個對象也不能「知道」彼此。

相關問題