如果我有vector<string*> *vect
或map<pair<string*, int*>, string*> *map
,则
如何清理所有内容(包括矢量/地图包含的所有对象)?
(Everything (vector,map,contents,string,ints)分配有new
)
这就够了吗?
delete vect;
delete map;
答案 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。它处理所有清理工作,根据我的经验,普通容器可以无缝地(意味着不破坏代码)被这些容器替换。
指针容器表示容器对所包含对象的所有权,这是你在这里所拥有的(否则你不必清理它)。
智能指针的容器是不同的,因为对象可能比容器更长寿。此外,使用智能指针时可能会有很小的性能损失,但这实际上取决于容器的大小以及对它们执行的操作类型。