2008-09-26 107 views
6

假设我有一类Foo,并希望使用一个std ::地图存储一些的boost :: shared_ptrs,如:的boost :: shared_ptr的标准集装箱

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替换时是否会被释放?我很确定它会是,但我认为这值得问问/分享。

+0

修改后的问题 - 应该被shared_ptr不auto_ptr, – Rob 2008-09-26 15:02:02

+0

这是“应该_have_” – 2011-11-17 10:30:24

回答

7

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

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

0

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

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

1

这取决于

您的容器类包含副本foo_sp的实例,当你执行m[0] = p2;最初在那个地方的p副本超出范围在你的...部分会发生什么。当时它将被删除如果没有其他foo_sp指它

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