这可能是一个有点愚蠢的问题 - 我应该在程序结束时在巨大的地图/集上调用delete
吗?
假设整个程序都需要地图/集(delete
是返回前的最后一行)并且它的大小非常大(> 4GB)。 delete
调用需要很长时间,从我的角度来看没有任何价值(内存不能早点发布),我错了吗?如果是这样,为什么?
答案 0 :(得分:7)
在程序退出后,C和C ++标准无法保证会发生什么。包括无法保证清理任何东西。例如,一些较小的实时操作系统不会执行自动清理。所以至少在理论上,你的程序肯定应该delete
new
所有你履行义务的义务,作为一个可以永久运行的完整和可移植的程序。
也有可能有人拿走你的代码并围绕它进行循环,这样你的树现在被创建了一百万次,然后找到你,带来“可信赖的说服者”,又名基地球棒,当他们发现为什么它在500次迭代后现在耗尽内存。
当然,就像所有事情一样,这可以通过许多不同的方式来论证,它实际上取决于你想要实现的目标,为什么要编写程序等等。我的编译器项目像筛子一样泄漏内存,因为我使用确切地说是您描述的内存管理方法(部分原因是跟踪每个动态分配对象的生命周期非常困难,部分原因是“我不能被打扰”。我敢肯定,如果有人真的想要一个好的pascal编译器,他们不会去我的代码anwyay)。
实际上,我的编译器项目构建了许多不同的数据结构,其中一些是树,数组等,但基本上它们都没有执行任何后续清理。修复它并不像构建需要删除每个节点的大树那样简单。然而,从概念上讲,这一切都归结为“做清理”或“不做清理”,而这又归结为“好吧,谁将使用/修改代码,以及你对环境有什么了解呢?跑进”。
答案 1 :(得分:1)
只要您的程序保持大致相同,并且内存用于整个执行,它就没有真正的区别。
然而,如果有人试图将你的程序转换成其他程序的组件,那么不释放内存可能会导致巨大的内存泄漏。
所以为了安全起见,也要更有条理,总是免费分配。在你的情况下,它非常容易,所以没有任何缺点 - 只是潜在的上行空间。
答案 2 :(得分:1)
如果您使用的是C ++ STL,则不需要任何显式删除,因为map / set会自动为您管理堆内存。实际上,您不能删除那些地图/集,因为它们不是指针。
对于存储在map / set中的大对象,可以在构造这些对象时使用智能指针,然后您将不再需要调用它们的析构函数。内存泄漏对于玩具程序来说可能不是问题,但对于现实生活中的程序是不可接受的,因为它们可能会运行很长时间甚至是永久性的。