【发布时间】:2014-03-17 01:33:51
【问题描述】:
我有一个具有共享指针映射的对象。
class A
{
map<string, shared_ptr<B>> child;
}
A 的析构函数会负责销毁映射中的指针吗?是否需要手动重置地图的值?
我看到 _Resetp<> and _Ref_count 持有 2 个对象,我很好奇问题是否在于我没有清理节点。
【问题讨论】:
-
除了 sharth 的出色回答之外:IIRC(如果我错了,请纠正我,某人)当您向 STL 容器附加内容时,它们会生成一个副本。因此,如果您的原始
shared_ptr在您请求引用计数时没有超出范围(例如,您在连续的行上写了shared_ptr<Node> ptr(node); child["myPtr"] = ptr;,然后立即请求引用计数)您会看到两个引用计数,因为您有两个shared_ptr对象(ptr及其副本child["myPtr"])引用node。 -
@CompuChip:不再是了。在大多数情况下,他们会将对象移动到容器中,只有在没有其他选项的情况下才会复制。
-
@LokiAstari:只有提供 rvalue 才能移动对象。 CompuChip 的示例提供了一个 lvalue,它必须被复制,因此您确实会看到 refcount 为 2。
标签: c++ visual-c++ memory-management shared-ptr visual-studio-2010