STL算法删除容器中的所有对象?

4
有没有一个STL实用程序/算法可以对所有对象执行delete *the_object_iterator;,以便我可以安全地进行clear()操作? STL容器是一个set,而对象是使用new创建的指向C++类的指针。
Boost似乎是最好的解决方案。我的目标是避免非可复制类的复制构造。

8
考虑使用Boost.PointerContainer代替。http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/ptr_container.html - K-ballo
请参见https://dev59.com/B3NA5IYBdhLWcg3wWsmK,了解如何删除存储在向量中的对象指针。 - Dabbler
@Dabbler 这不是一个内置的一行代码。 - unixman83
8
在容器中存储指针通常不是个好主意,因为如果容器意外被销毁(例如通过异常),你就没有机会进行适当的清理工作了。 - Mark Ransom
可以持有原始(愚钝)指针。持有智能指针也可以。实际上,这是一种常见的模式。 - MSalters
@MSalters Boost.PointerContainer 是最好的解决方案。对我来说,智能指针有点傻。;-) - unixman83
3个回答

16

使用智能指针来持有类指针。

std::set<std::unique_ptr<MyClass> > mySet;

没有注意到那是在 std:: 命名空间中。 - unixman83
4
unique_ptr是C++11中的新特性。如果你的编译器还不支持它,你可以使用boost::shared_ptr - Fred Larson

10
据我所知,目前没有标准算法可以删除所有对象。但是,您可以轻松地构建一个算法:
template< typename T > invoke_delete( T* ptr ){ delete ptr; }

std::for_each( set.begin(), set.end(), &invoke_delete< set_value_type > );

或者 std::for_each(set.begin(), set.end(), [](T* p){delete p;})(不是一个模板;请自行替换 T)。 - MSalters
1
@MSalters:确实如此,但那是C++11,我碰巧知道OP正在使用VC++9。 - K-ballo

7

使用Boost指针容器是一个不错的选择。

它们不仅可以存储动态分配的对象,而且这些对象还可以作为引用访问,从而更方便地使用标准算法对对象进行操作。

boost::ptr_set<MyClass>   setData;

setData.insert(new MyClass);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接