如何有效删除存储在多个容器中的C ++对象? auto_ptr的?

时间:2009-09-07 07:45:40

标签: c++ stl auto-ptr

我有一个应用程序在执行期间创建某种类型的对象(比如“Foo”类),跟踪一些统计信息,并将它们插入到两个STL映射中的一个或两个中,例如:

map<Foo*, int> map1;
map<Foo*, int> map2;

我想知道删除Foo对象的最佳方法是什么。目前我的解决方案是迭代map1和map2,并将Foo指针放入一个集合中,然后在这个集合上进行交互并在每个集合上调用delete。

是否有更有效的方法,可能使用auto_ptr?如果是这样的话,因为auto_ptr&lt;&gt;对象不能存储在STL容器中?

提前致谢。

4 个答案:

答案 0 :(得分:10)

正如您所说,

auto_ptr个对象不能存储在STL容器中。为此,我喜欢使用shared_ptr对象(来自boost)。它是一个引用计数指针,因此当对象超出范围时,该对象将被删除一次。

typedef<shared_ptr<Foo>, int> Map;
Map map1;
Map map2;

现在,您只需添加和删除map1map2shared_ptr对象,因为它们是指针,当删除最后一个引用时,它们将负责删除。

答案 1 :(得分:7)

使用boost :: shared_ptr - 它专门用于可以从多个位置引用对象的情况。在这里使用auto_ptr不是一个选项 - 一旦对象的第一个auto_ptr被破坏,第二个就会留下一个悬空指针,这是未定义行为的直接方式。

答案 2 :(得分:3)

我猜你需要一个主列表或一组对象,如果你有能力复制它们,或者更有可能由指针保存,那么你可以复制指针并将它们放到其他集合中。

std::list<Foo*> Master;

这些其他集合(示例中为map1map2)可以随时插入和删除这些指针。当你最终要删除所有内容时,你可能只是删除这些地图,或者让它们超出范围,或者忽略它们,只需一次,回到主列表并迭代删除找到的指针。 / p>

答案 3 :(得分:1)

http://ootips.org/yonat/4dev/smart-pointers.html讨论了可以存储在STL容器中的某些智能指针。 See here