我有一个应用程序在执行期间创建某种类型的对象(比如“Foo”类),跟踪一些统计信息,并将它们插入到两个STL映射中的一个或两个中,例如:
map<Foo*, int> map1;
map<Foo*, int> map2;
我想知道删除Foo对象的最佳方法是什么。目前我的解决方案是迭代map1和map2,并将Foo指针放入一个集合中,然后在这个集合上进行交互并在每个集合上调用delete。
是否有更有效的方法,可能使用auto_ptr?如果是这样的话,因为auto_ptr&lt;&gt;对象不能存储在STL容器中?
提前致谢。
答案 0 :(得分:10)
auto_ptr
个对象不能存储在STL容器中。为此,我喜欢使用shared_ptr
对象(来自boost)。它是一个引用计数指针,因此当对象超出范围时,该对象将被删除一次。
typedef<shared_ptr<Foo>, int> Map;
Map map1;
Map map2;
现在,您只需添加和删除map1
和map2
,shared_ptr
对象,因为它们是指针,当删除最后一个引用时,它们将负责删除。
答案 1 :(得分:7)
使用boost :: shared_ptr - 它专门用于可以从多个位置引用对象的情况。在这里使用auto_ptr不是一个选项 - 一旦对象的第一个auto_ptr被破坏,第二个就会留下一个悬空指针,这是未定义行为的直接方式。
答案 2 :(得分:3)
我猜你需要一个主列表或一组对象,如果你有能力复制它们,或者更有可能由指针保存,那么你可以复制指针并将它们放到其他集合中。
std::list<Foo*> Master;
这些其他集合(示例中为map1
和map2
)可以随时插入和删除这些指针。当你最终要删除所有内容时,你可能只是删除这些地图,或者让它们超出范围,或者忽略它们,只需一次,回到主列表并迭代删除找到的指针。 / p>
答案 3 :(得分:1)
http://ootips.org/yonat/4dev/smart-pointers.html讨论了可以存储在STL容器中的某些智能指针。 See here