【问题标题】:Should I delete big tree collections in C++ at the end of program or leave that to OS? [closed]我应该在程序结束时删除 C++ 中的大树集合还是将其留给操作系统? [关闭]
【发布时间】:2014-11-23 04:09:13
【问题描述】:

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

【问题讨论】:

标签: c++ memory-management


【解决方案1】:

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

也有可能有人拿走了你的代码并在它周围放置一个循环,这样你的树现在被创建了一百万次,然后去找你,带来了“可信赖的说服者”,也就是棒球棒,当他们发现为什么在 500 次迭代后内存不足时。

当然,就像所有事情一样,这可以用多种不同的方式进行争论,这实际上取决于您要实现的目标,编写程序的原因等。我的编译器项目像筛子一样泄漏内存,因为我使用正是您描述的内存管理方法(部分原因是跟踪每个动态分配对象的生命周期非常困难,部分原因是“我不会被打扰”。我确定如果有人真的想要一个好的 Pascal 编译器,他们不会去我的代码anwyay)。

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

【讨论】:

    【解决方案2】:

    如果您使用 C++ STL,则无需任何显式删除,因为 map/set 会自动为您管理堆内存。实际上,您不允许删除这些映射/集合,因为它们不是指针。

    对于存储在 map/set 中的大型对象,您可以在构造这些对象时使用智能指针,然后您将不再需要调用它们的析构函数。内存泄漏对于玩具程序可能不是问题,但对于现实生活中的程序来说是不可接受的,因为它们可能会运行很长时间甚至永远。

    【讨论】:

      【解决方案3】:

      只要您的程序或多或少保持不变,而内存用于整个执行,它并没有真正的区别。

      然而,如果有人试图将你的程序变成其他程序的组件,不释放内存可能会导致巨大的内存泄漏。

      所以为了安全起见,也为了更有条理,总是释放你分配的东西。在你的情况下,这很容易,所以没有缺点 - 只是一个潜在的好处。

      【讨论】:

        猜你喜欢
        • 2021-04-05
        • 2020-06-16
        • 2017-10-13
        • 2016-02-20
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        • 2018-11-08
        • 2014-06-20
        相关资源
        最近更新 更多