【问题标题】:What is the correct way to clean all the shared pointers that are in a map?清除地图中所有共享指针的正确方法是什么?
【发布时间】:2014-03-17 01:33:51
【问题描述】:

我有一个具有共享指针映射的对象。

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

A 的析构函数会负责销毁映射中的指针吗?是否需要手动重置地图的值?

我看到 _Resetp&lt;&gt; and _Ref_count 持有 2 个对象,我很好奇问题是否在于我没有清理节点。

【问题讨论】:

  • 除了 sharth 的出色回答之外:IIRC(如果我错了,请纠正我,某人)当您向 STL 容器附加内容时,它们会生成一个副本。因此,如果您的原始shared_ptr 在您请求引用计数时没有超出范围(例如,您在连续的行上写了shared_ptr&lt;Node&gt; 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


【解决方案1】:

假设您正在使用boost::shared_ptrstd::shared_ptr 或其他类似的东西,那么当A 被销毁时,shared_ptrs 的引用计数都会减一,这可能会导致它们自己的销毁。

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多