繁体   English   中英

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

[英]How to clean up a vector/map properly?

如果我有一个vector<string*> *vectmap<pair<string*, int*>, string*> *map
如何清理所有内容(包括vector / map包含的所有对象)?
(一切(矢量,地图,内容,字符串,整数)分配new

这够了吗:

delete vect;
delete map;

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

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

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

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

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;

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM