2016-05-17 28 views
2

我需要在地圖中持有智能指針。該映射不擁有該對象,但在其他位置有多個shared_ptrs對象。從不具有所有權的容器中清理智能Ptr的模式

一旦所有其他對象的shared_ptrs被銷燬而無需定期輪詢地圖,我如何確保將密鑰從此地圖中移除?

+2

怎麼樣。在地圖中存儲一個原始指針。使用自定義刪除器來保存對映射的引用的shared_ptr,並在定製刪除器被調用時從映射中刪除鍵/值。 –

+0

我一直在想這些行(在我的情況下,我可以在類的析構函數中處理它,因爲這個對象總是會被分配一個智能ptr),但我想知道是否有一個通常規定的模式來處理這個,因爲這個問題似乎並不是那麼罕見。謝謝。 – Kindread

回答

2

如果「沒有投票」您的意思是您希望std::shared_ptr爲您處理所有事情,那麼知道這不是std::shared_ptr的功能。確實,shared_ptr知道它的當前使用次數,但它沒有收到任何信號來更新它的任何更改。

但是,您可以有一個解決方案,有時候並不是所有時間都執行檢查。

我會建議使用std::map,其中包含std::weak_ptr而不是std::shared_ptr。您將需要運行檢查以查看哪些ptrs無效並將其刪除。多久檢查一次將取決於你。例如,您只能在添加新項目時檢查地圖,並且地圖中有超過20,000個項目。

+0

使用析構函數或自定義刪除器,我可以想到做到這一點的方法。我沒有考慮根據大小而不是週期間隔來檢查地圖,謝謝。 – Kindread

+0

如果你使用這個解決方案,那麼確保你使用std :: weak_ptr而不是std :: shared_ptr非常重要,否則當你清理你的地圖時可能不會經常地釋放內存。 –

+1

@Kindread使用析構函數/自定義刪除程序是一種方法,只要你對他們瞭解你的地圖是否合適。 –

相關問題