我应该在程序结束时删除C++中的大树集合还是将其留给操作系统?

won*_*dra 3 c++ memory-management

这可能是一个有点愚蠢的问题 - 我应该delete在程序结束时调用巨大的地图/集合吗?
假设整个程序都需要map/set(delete返回前的最后一行),它的大小非常大(> 4GB).这个delete电话花了很长时间,从我的角度来看没有任何价值(内存不能早点发布),我错了吗?如果是这样,为什么?

Mat*_*son 7

在程序退出后,C和C++标准无法保证会发生什么.包括无法保证清理任何东西.例如,一些较小的实时操作系统不会执行自动清理.所以至少在理论上,你的程序绝对应该尽delete你所能new履行它作为一个可以永久运行的完整和可移植程序的义务.

也有可能有人拿走你的代码并围绕它进行循环,这样你的树现在被创建了一百万次,然后找到你,带来"可信赖的说服者",又称基地球棒,当他们找出为什么它在500次迭代后现在耗尽内存.

当然,就像所有事情一样,这可以通过许多不同的方式来论证,它实际上取决于你想要实现的目标,为什么要编写程序等等.我的编译器项目像筛子那样泄漏内存,因为我使用了完全正确的方法你描述的内存管理(部分是因为跟踪每个动态分配的对象的生命周期是非常困难的,部分是因为"我不能被打扰".我敢肯定,如果有人真的想要一个好的pascal编译器,他们不会去找我的代码anwyay).

实际上,我的编译器项目构建了许多不同的数据结构,其中一些是树,数组等,但基本上它们都没有执行任何后续清理.修复它并不像构建需要删除每个节点的大树那样简单.然而,从概念上讲,这一切都归结为"做清理"或"不做清理",而这又归结为"好吧,谁将使用/修改代码,以及你对环境有什么了解呢?跑进".