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都将有自己的引用计数减一,这可能会导致自己的毁灭。

相关问题