如何正确清理矢量/地图?

时间:2010-06-17 13:13:59

标签: c++ memory-management vector map

如果我有vector<string*> *vectmap<pair<string*, int*>, string*> *map,则 如何清理所有内容(包括矢量/地图包含的所有对象)? (Everything (vector,map,contents,string,ints)分配有new

这就够了吗?

delete vect;
delete map;

4 个答案:

答案 0 :(得分:6)

不,您必须遍历vector / map,逐个删除和删除其项目(正如@SB指出的那样,可能需要递归处理其成员)。

(你可以通过简单地删除项目来逃避, 如果 你绝对相信没有人会在矢量被删除之前访问矢量元素 - 但它是删除之前删除每个项目仍然更安全。这可以确保程序在任何时候都是正确的,从而消除了细微错误的可能性,并且可以在长期内简化维护。)

顺便说一下,这是为什么建议在集合中存储智能指针而不是原始指针的原因之一。

答案 1 :(得分:4)

你真的应该考虑使用智能指针

vector<boost::shared_ptr<std::string> >* some_vector = new std::vector<boost::shared_ptr<std::string> >;

some_vector->push_back(boost::shared_ptr<std::string>("Hello World !"));

delete some_vector; // This will delete the contained std::string's as well
some_vector = NULL;

基本上,智能指针负责指向数据的生命周期。他们甚至可以做更多的事情(例如计数引用等),但我建议您阅读this page以了解有关不同类型的智能指针的更多信息。

您甚至可以指定要使用的自定义“释放”功能,而不是默认值(delete)。

答案 2 :(得分:0)

不,您必须手动迭代每个容器并在其包含的指针上调用delete。向量没有分配那个内存,所以它不会为你清理它。

如果你使用智能指针,那么指针本身将处理释放它的内存。否则,您必须通过手动释放来平衡手动分配。

答案 3 :(得分:0)

您可能需要考虑Boost Pointer Container。它处理所有清理工作,根据我的经验,普通容器可以无缝地(意味着不破坏代码)被这些容器替换。

指针容器表示容器对所包含对象的所有权,这是你在这里所拥有的(否则你不必清理它)。

智能指针的容器是不同的,因为对象可能比容器更长寿。此外,使用智能指针时可能会有很小的性能损失,但这实际上取决于容器的大小以及对它们执行的操作类型。