boost :: shared_ptr标准容器

时间:2020-03-06 14:47:22  来源:igfitidea点击:

假设我有一个foo类,并希望使用std :: map存储一些boost :: shared_ptrs,例如:

class foo;

typedef boost::shared_ptr<foo> foo_sp;
typeded std::map<int, foo_sp> foo_sp_map;

foo_sp_map m;

如果我在地图上添加了一个新的foo_sp,但是使用的键已经存在,是否将现有条目删除?例如:

foo_sp_map m;

void func1()
{
    foo_sp p(new foo);
    m[0] = p;
}

void func2()
{
    foo_sp p2(new foo);
    m[0] = p2;
}

当原始指针(p)替换为p2时,是否将其释放?我很确定会这样,但是我认为值得一问/分享。

解决方案

首先,问题标题为boost :: auto_ptr,但实际上是指boost :: shared_ptr

是的,原始指针将被释放(如果没有进一步的共享引用)。

由于stackoverflow不允许我发表评论,所以我只是回答。 :/

我看不到" p"超出范围,因此它所指向的对象将不会被释放。 " p"仍将指向它。

这取决于...部分中发生了什么

当我们执行m [0] = p2;时,容器类包含foo_sp实例的副本;原本在该位置的p`的副本超出了范围。那时,如果没有其他foo_sp引用它,它将被删除。

如果在第二行foo_sp p(new foo);中声明的副本仍然存在,则不会释放内存。一旦删除了对该条目的所有引用,该条目将被删除。