我正在编写c ++并且在过程的生命周期中创建了多个对象,当进程将所有内存释放到操作系统时,为什么要清理并释放内容?
答案 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)如果你自己很难清理,它可能是你的设计和内存/资源管理中的错误的一个指标。通过适当地管理资源,您可以强制进行干净的设计,并且不要将此类管理留在事后的想法中。因此,我认为当您将代码设计为在完成时清理时,您的代码就会减少错误。