6

假设我有一个类 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替换后会被释放吗?我很确定它会是,但我认为值得询问/分享。

4

3 回答 3

7

首先,你的问题标题是 boost::auto_ptr,但实际上你的意思是 boost::shared_ptr

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

于 2008-09-26T15:00:20.190 回答
1

这取决于您的 ... 部分中发生的情况

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

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

于 2008-09-26T15:09:36.657 回答
0

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

我没有看到“p”超出范围,所以它指向的对象不会被释放。“p”仍将指向它。

于 2008-09-26T15:05:34.140 回答