当过程停止时清理 - 为什么

时间:2018-01-24 15:29:44

标签: c++

我正在编写c ++并且在过程的生命周期中创建了多个对象,当进程将所有内存释放到操作系统时,为什么要清理并释放内容?

4 个答案:

答案 0 :(得分:4)

因为它迫使你编写干净的可重用软件。让我们想象一下你完成游戏的情况,即使你没有清理代码,一切都很好。

现在,鉴于取得了巨大的成功,你制作续集并计划重用代码。但是这次你有一个合作模式,一个配对大厅和一个故事模式。您意识到在切换模式时,您可以简单地删除主Game* object,并创建一个具有不同参数的新主。

然后你意识到:oops,虽然这样可以很好地工作,但是所有未分配的内存都会阻止你使用这种方法。

这是一直存在的模式。它有不同的口味。您希望编写单元测试,但在测试之间需要清理所有内容。没有清理:在第一个之后无法进行清洁测试。

它看起来像是额外的工作,但它将在未来付出很多

答案 1 :(得分:0)

我可以想到多种原因:

<强>模块化

  • 应用程序通常是模块的集合
  • 模块应具有明确定义的目的,并且应该可以在整个应用程序中重复使用,或者甚至更好的应用程序
  • 在编写模块时,不应该假设其他人将如何或何时使用它,因此他/她应该运用最佳实践并正确编写

<强>分析

当故意泄漏资源时,分析实际内存泄漏 变得几乎不可能完成任务。您不能区分应该释放资源的模块和不应该使用资源的模块。

答案 2 :(得分:0)

因为你认为错了。在某些情况下,你是对的。如果您实例化这样的对象:A a;,那么当A超出其上下文时,它将被销毁。现在,如果您执行A *a = new A[12];,则会保留12个内存空间,并保留A实例的大小。如果您不执行任何操作,则在上下文结束时,a将被销毁。但是a是一个指针,所以只有数组的地址会被破坏,12个空格仍然会被分配在内存中而不能被访问。它们对每个人都是迷失的。

还有很多其他的例子。尝试使用Valgrind,你会看到。

现在,如果您的程序变得越来越复杂,添加所有这些内存泄漏可能会成为您自己程序环境中的问题。当然,当你的程序结束时,内存会被返回给操作系统,但这绝对不是容忍内存泄漏的理由。

答案 3 :(得分:0)

有很多充分的理由。

1)有些系统在您之后无法清理。尤其适用于嵌入式系统或没有操作系统的系统。

2)通常,应用程序main()仅仅是实例化可重用的模块和子系统,并且应该管理自己的资源。如果main()只是一个实例化某些对象的次要函数,那么运行事件循环,然后你的应用程序清理&#34;代码不是真正的应用程序清理,而是模块清理。差别很大。

3)想象一下,你的图书馆是用别人的代码运行的,你不知道相对于整个应用程序的生命周期,它将被使用多长时间。如果您的代码泄漏,它将很快被丢弃为低质量的代码。

4)如果你自己很难清理,它可能是你的设计和内存/资源管理中的错误的一个指标。通过适当地管理资源,您可以强制进行干净的设计,并且不要将此类管理留在事后的想法中。因此,我认为当您将代码设计为在完成时清理时,您的代码就会减少错误。