2

我有一個擁有共享指針映射的對象。清除映射中所有共享指針的正確方法是什麼?

class A 
{ 
    map<string, shared_ptr<B>> child; 
} 

A的析構函數是否負責銷燬映射中的指針?是否需要手動重置地圖的值?

我看到一個_ Resetp<> and _Ref_coun t堅持2個對象,我很好奇,如果問題是我沒有清潔節點。

+0

除了sharth的優秀答案:IIRC(請糾正我,如果我錯了,某人)STL容器會在您追加內容時複製副本。因此,如果您的原始'shared_ptr'在請求引用計數的位置上未超出範圍(例如,您已在連續行中寫入'shared_ptr ptr(node); child [「myPtr」] = ptr;',然後立即請求refcount),你會看到兩個refcounts,因爲你有兩個'shared_ptr'對象('ptr'及其副本'child [「myPtr」]')引用'node'。 – CompuChip

+0

@CompuChip:不再有。如果沒有其他選擇,他們會在大多數情況下將對象移動到容器中,只能複製。 –

+2

@LokiAstari:如果您提供_rvalue_,則只能移動該對象。 CompuChip的例子提供了一個_lvalue_,它必須被複制,所以你確實會看到2的refcount。 –

回答

5

假設你正在使用boost::shared_ptrstd::shared_ptr,還是其他什麼東西是相似的,那麼當A被破壞,shared_ptrs都將有自己的引用計數減一,這可能會導致自己的毀滅。

相關問題