2013-04-07 60 views
1

的我注意到一個奇怪的事實有關的shared_ptr語義空的shared_ptr

int* p = nullptr; 
std::shared_ptr<int> s(p); // create a count (1). 
std::shared_ptr<int> s2(s); // count go to 2. 
assert(s.use_count() == 2); 

我不知道什麼是語義不止於此。爲什麼s和s2共享一個nullptr?這有什麼意義嗎?

或者這種罕見的情況不值得一個if語句(代價高昂?)?

感謝您的任何啓示。

+0

AFAICT,無論它是否爲空或它是否是有效的對象都沒有區別,那爲什麼要關心它? – chris 2013-04-07 20:34:41

+0

我不認爲引用計數指針對nullptr有特殊處理。 – BlackCat 2013-04-07 20:35:47

+1

在C++ 11中,'use_count()'必須在空'shared_ptr'(20.7.2.2.5/7)上爲'0'。 – ipc 2013-04-07 20:38:27

回答

3

的語義是:

  • 如果默認構造一個共享指針,或構建一個從nullptr_t,它是空的;也就是說,它沒有任何指針。
  • 如果您從原始指針構造一個指針,它將獲取該指針的所有權,不管它是否爲空。我想這是因爲你提到的原因(避免運行時檢查),但我只能推測這一點。

所以你的例子不是空的;它擁有一個空指針。

+0

謝謝,我想這沒關係。順便說一下,引用計數器分配比運行時檢查要貴(但這種情況肯定不太頻繁)。 – 2013-04-07 20:52:44

1

誰在乎他們在分享nullptr?一旦它們都被銷燬,它們將嘗試delete nullptr;,這將不起作用。這非常好,符合shared_ptr的語義。

它適用於空指針值不需要特殊情況的方式。它是否出現在你的代碼中只是歸結爲你是否有一些函數可以接受或返回null shared_ptr s。

+0

感謝您的快速回復! – 2013-04-07 20:56:46