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);
中声明的副本仍然存在,则不会释放内存。一旦删除了对该条目的所有引用,该条目将被删除。