我需要在地圖中持有智能指針。該映射不擁有該對象,但在其他位置有多個shared_ptrs對象。從不具有所有權的容器中清理智能Ptr的模式
一旦所有其他對象的shared_ptrs被銷燬而無需定期輪詢地圖,我如何確保將密鑰從此地圖中移除?
我需要在地圖中持有智能指針。該映射不擁有該對象,但在其他位置有多個shared_ptrs對象。從不具有所有權的容器中清理智能Ptr的模式
一旦所有其他對象的shared_ptrs被銷燬而無需定期輪詢地圖,我如何確保將密鑰從此地圖中移除?
如果「沒有投票」您的意思是您希望std::shared_ptr
爲您處理所有事情,那麼知道這不是std::shared_ptr
的功能。確實,shared_ptr
知道它的當前使用次數,但它沒有收到任何信號來更新它的任何更改。
但是,您可以有一個解決方案,有時候並不是所有時間都執行檢查。
我會建議使用std::map
,其中包含std::weak_ptr而不是std::shared_ptr
。您將需要運行檢查以查看哪些ptrs無效並將其刪除。多久檢查一次將取決於你。例如,您只能在添加新項目時檢查地圖,並且地圖中有超過20,000個項目。
使用析構函數或自定義刪除器,我可以想到做到這一點的方法。我沒有考慮根據大小而不是週期間隔來檢查地圖,謝謝。 – Kindread
如果你使用這個解決方案,那麼確保你使用std :: weak_ptr而不是std :: shared_ptr非常重要,否則當你清理你的地圖時可能不會經常地釋放內存。 –
@Kindread使用析構函數/自定義刪除程序是一種方法,只要你對他們瞭解你的地圖是否合適。 –
shared_ptr
可以提供一個deleter
它可以幫助刪除對象。在此deleter
內部,您可以相應地更新map
。
例如參考:http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
怎麼樣。在地圖中存儲一個原始指針。使用自定義刪除器來保存對映射的引用的shared_ptr,並在定製刪除器被調用時從映射中刪除鍵/值。 –
我一直在想這些行(在我的情況下,我可以在類的析構函數中處理它,因爲這個對象總是會被分配一個智能ptr),但我想知道是否有一個通常規定的模式來處理這個,因爲這個問題似乎並不是那麼罕見。謝謝。 – Kindread