我觉得开发商谈记忆泄漏,但是当你问他们什么这意味着很多没有个想法。防止这些情况下,我们的决定之一。

请没有维基百科的定义...

什么是你最好的定义 存储器泄漏 是什么 最好的方式 防止他们吗?

有帮助吗?

解决方案

有两个定义(至少对我而言):

天真定义:无法释放无法访问的内存,在执行分配过程期间,任何进程都无法再分配该内存。这通常可以通过使用GC(垃圾收集)技术或通过自动化工具检测来解决。

微妙的定义:无法释放可访问的内存,程序无法正常运行。使用自动化工具或不熟悉代码的程序员几乎无法检测到这种情况。虽然从技术上讲它不是泄漏,但它与天真的具有相同的含义。这不仅仅是我自己的想法。您可以遇到使用垃圾收集语言编写的项目,但仍然提到在更改日志中修复内存泄漏。

其他提示

由于对其的引用已丢失而无法使用的已分配内存。

分配内存资源并且不再需要时不正确发布的过程,通常是通过错误的编码实践引入的。

在某些语言中有一些内置的方法可以帮助防止它们,尽管避免它们的最佳方法是通过努力观察代码执行路径和代码审查。保持方法简洁和单一用途有助于保持资源使用的严格范围,并且不太容易在洗牌中丢失。

定义:分配后无法释放内存。

w:

  

在计算机科学中,内存泄漏是计算机程序的一种特殊类型的无意内存消耗,其中程序在不再需要时无法释放内存。这种情况通常是程序中的一个错误导致它无法释放它不再需要的内存的结果。

不再需要时未释放的内存,且不再<!>“可达<!>”。例如,在非托管代码中,如果我使用<!> quot; new <!> quot;实例化一个对象,但我不使用<!> quot; delete <!> quot;当我完成它(我的指针超出了范围或其他东西)。

预防它们的最佳方法可能取决于您询问的对象以及您使用的语言。当然,垃圾收集是一个很好的解决方案,但可能会有一些与此相关的开销,这不是什么大问题,除非你的性能是你最关心的问题。垃圾收集可能并不总是可用,具体取决于您使用的语言。

或者,您可以确保具有适当的删除和/或析构函数。还有很多方法和工具可以检测内存泄漏,但这取决于您使用的语言和/或IDE。

存储器泄漏:没有免费的记忆不再需要之前,无论是:

  • 程序终止
  • 额外存储器被分配

最好的办法,以防止存储器泄漏:免费存储,只要它是不再需要。

有两种方法可以定义内存泄漏。

首先,如果在不再有任何引用的情况下没有释放数据,则该数据无法访问(除非您有一些损坏的指针或读取缓冲区中的数据或其他内容)。基本上,如果你不释放/删除堆上分配的数据,它就会变得无法使用,只会浪费内存。

可能存在指针丢失但数据仍可访问的情况。例如,如果将指针存储在int中,或者将偏移量存储到指针(使用指针算术),则仍然可以返回原始指针。

在第一个定义中,数据由垃圾收集器处理,垃圾收集器跟踪数据的引用数量。

其次,如果在上次使用时未释放/删除内存,则内存基本上会泄露。它可以被引用,并且可以立即自由使用,但是已经犯了这样的错误。可能有一个正当的理由(例如,在析构函数有一些奇怪的副作用的情况下),但这表明程序设计不好(在我看来)。

第二种类型的内存泄漏经常发生在编写使用文件IO的小程序时。您打开文件,写入数据,但一旦完成就不要关闭它。 FILE *可能仍在范围内,并且可以轻松关闭。同样,可能有一些理由这样做(例如锁定其他程序的写访问权限),但对我而言,这是糟糕设计的标志。

在第二个定义中,数据不是由垃圾收集器处理的,除非编译器/解释器足够智能(或愚蠢)知道它不会再被使用,这样释放数据不会导致任何一方的效果。

以下是一些防止/检测内存泄漏的技术:

  1. 根据内存消耗考虑您的算法。其他受访者提到您不必丢失指向已分配项目的指针以泄漏内存。即使你的实现包含零指针错误,如果你在实际需要之后很久就保留了已分配的项目,你仍然可以有效地泄漏内存。

  2. 分析您的应用程序。您可以使用Valgrind或Purify等内存调试工具来查找泄漏。

  3. 黑盒测试。观察编译后的代码在您提供大型数据集后会发生什么情况,或者让它长时间运行。看看它的内存占用量是否有无限制增长的趋势。

所有给出的定义在这里(当时我写了这个,我们得到更好的答案,因为)未能解决的一个边缘案例:

你有一个单独的分配存在创建和这种存储器通常是举行了,只要作为程序运行,即使目前的使用是,它是未知是否有任何未来的使用将由或没有。这通常是因为开销的重建。

通过"无法免费时用它做"标准,这将被认为是一个泄漏和我见过的漏报告工具,呼这样的事情泄漏的存是仍在使用。(实际上的代码可以不包含码能够清洗的对象。)

然而,我遇到了代码的这种性质在编译器库之前,甚至当的成本重新创建的对象不是所有的伟大。

泄漏或不?

编辑:这个答案是错误的。我要离开它作为一个例子,它是多么容易被误认为有关的东西你以为你很好。 谢谢你给每个人指出我的错误。

存储器泄漏是:编程的错误。你的软件借鉴了一些记忆从系统,使用它,然后未能返回到系统中时,它已完成。这意味着,特别是大块的记忆永远不能使用的任何其他程序,直到重新启动系统。许多这种泄漏可能会使用了所有可用的存储器,导致在一个完全无用的系统。

防止存储器的泄漏、实践RIIA,并始终考验你的软件。有很多工具可用于这项任务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top