A C++ std::shared_ptr<..>
可能是空並且它也可能是null。這兩個概念都存在,它們是而不是等效。另外,在這些情況之間,暗示總是如此。如何測試shared_ptr是否爲空或者什麼都不擁有
後一種情況很容易檢測,因爲operator bool
提供了精確的測試。根據文檔,它「檢查*this
是否存儲非空指針,即是否get() != nullptr
」。
是否有在前一種情況下,一個測試,其中一點是空的情況?
我對此的使用很簡單。我有一個擁有靜態工廠方法的類。靜態工廠方法內部是一個靜態本地shared_ptr
到類的一個實例,初始化爲nullptr
。對這個工廠方法的第一次調用構造了一個類的實例,並在返回它的一個副本之前初始化靜態本地shared_ptr
- 這由mutex
來保護。 shared_ptr
可能被任何東西持有,被複制並傳遞過來,進一步的副本可能通過對靜態工廠的額外調用而獲得,最後,當所有副本被破壞時,shared_ptr
的刪除程序破壞該實例。
實例本身是用我的類包裝的傳統C API創建和破壞的,儘管這些實例旨在作爲單例共享,但是當它們不再需要時,它們也需要清理 - 不像單身。
目前,我正在使用空檢查來決定靜態本地shared_ptr
應該被初始化還是僅僅被複制。我害怕這個測試無法檢測到需要重新初始化的情況 - 例如,如果在所有先前的用戶放棄其引用並且共享實例被刪除之後某些事情試圖獲取實例。
或者是否確實shared_ptr
被重置爲nullptr
當引用計數下降到零並且刪除器被調用?還針對自定義刪除者?
另外相關:What is the difference between an empty and a null std::shared_ptr in C++?
如何檢查,如果[計數器(http://en.cppreference.com/w/cpp/memory/shared_ptr/use_count)爲零? –
由於註釋:「但是,這在多線程環境中不能保證。」 – Xharlie
當我讀到這個時,聽起來好像第一次初始化發生後,對於某個shared_ptr對象總是有一個引用計數1。如果不是的話,你會用這個假設的電話來確定它的當前狀態是什麼目的? 聽起來你可能想要weak_ptr行爲。或者,也許你可以澄清這個問題,以使這一點更加清楚(即「在所有先前的用戶放棄其引用並且共享實例被刪除後的某個時候嘗試獲取實例的情況」)。 – cnettel