1

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

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

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

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

提前致谢。

4

4 回答 4

10

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

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

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

于 2009-09-07T07:50:21.797 回答
7

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

于 2009-09-07T07:48:47.937 回答
3

我猜你需要一个主列表或一组对象,如果你能负担得起复制它们,要么按值保存,要么更可能由指针保存,这样你就可以复制指针并将它们放入其他集合中。

std::list<Foo*> Master;

这些其他集合(map1map2您的示例中)可以随时插入和删除这些指针。当您最终想要删除所有内容时,您可能只需删除映射,或者让它们超出范围,或忽略它们,然后返回主列表并迭代删除找到的指针。

于 2009-09-07T09:39:10.063 回答
1

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

于 2009-09-07T07:51:12.190 回答