boost :: shared_ptr标准容器
-
02-07-2019 - |
题
假设我有一个类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
是的,原始指针将被释放(如果没有进一步的共享引用)。
其他提示
这取决于你...章节中发生的事情
当您执行 m [0] = p2;
p
的副本时,您的容器类包含foo_sp实例的副本最初在那个地方超出了范围。那时它将被删除如果没有其他foo_sp引用它。
如果在第二行 foo_sp p(new foo);
中声明的副本仍然存在,那么内存将不会被释放。删除所有对它的引用后,该条目将被删除。
由于stackoverflow不允许我发表评论,我只想回答。 :/
我没有看到“p”超出范围,因此它指向的对象将不被释放。 &QUOT; P&QUOT;仍然会指出它。
不隶属于 StackOverflow