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

puc*_*cio 1 c++ stl auto-ptr

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

map<Foo*, int> map1;
map<Foo*, int> map2;
Run Code Online (Sandbox Code Playgroud)

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

有没有更有效的方法,可能使用auto_ptr?如果是这样,因为auto_ptr <>对象不能存储在STL容器中?

提前致谢.

180*_*ION 10

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

typedef<shared_ptr<Foo>, int> Map;
Map map1;
Map map2;
Run Code Online (Sandbox Code Playgroud)

现在,你只需要添加和删除从map1map2,shared_ptr对象,因为他们指针,他们将采取删除,当最后一个引用被移除的照顾.

  • 我猜你的意思是"当它不再被引用时",而不是"当它超出范围时".在这种情况下,范围很难界定. (2认同)

sha*_*oth 7

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