2
我有一个拥有共享指针映射的对象。清除映射中所有共享指针的正确方法是什么?
class A
{
map<string, shared_ptr<B>> child;
}
A的析构函数是否负责销毁映射中的指针?是否需要手动重置地图的值?
我看到一个_ Resetp<> and _Ref_coun
t坚持2个对象,我很好奇,如果问题是我没有清洁节点。
我有一个拥有共享指针映射的对象。清除映射中所有共享指针的正确方法是什么?
class A
{
map<string, shared_ptr<B>> child;
}
A的析构函数是否负责销毁映射中的指针?是否需要手动重置地图的值?
我看到一个_ Resetp<> and _Ref_coun
t坚持2个对象,我很好奇,如果问题是我没有清洁节点。
假设你正在使用boost::shared_ptr
,std::shared_ptr
,还是其他什么东西是相似的,那么当A
被破坏,shared_ptrs都将有自己的引用计数减一,这可能会导致自己的毁灭。
除了sharth的优秀答案:IIRC(请纠正我,如果我错了,某人)STL容器会在您追加内容时复制副本。因此,如果您的原始'shared_ptr'在请求引用计数的位置上未超出范围(例如,您已在连续行中写入'shared_ptr ptr(node); child [“myPtr”] = ptr;',然后立即请求refcount),你会看到两个refcounts,因为你有两个'shared_ptr'对象('ptr'及其副本'child [“myPtr”]')引用'node'。 –
CompuChip
@CompuChip:不再有。如果没有其他选择,他们会在大多数情况下将对象移动到容器中,只能复制。 –
@LokiAstari:如果您提供_rvalue_,则只能移动该对象。 CompuChip的例子提供了一个_lvalue_,它必须被复制,所以你确实会看到2的refcount。 –