最佳内存泄漏定义

时间:2008-11-23 03:10:38

标签: memory-leaks definition

我觉得开发人员谈论内存泄漏但当你问他们这意味着许多人不知道。为了防止这些情况,让我们决定一个。

请不要维基百科定义......

  

你对a的最佳定义是什么?   内存泄漏以及最佳方式是什么   防止他们?

11 个答案:

答案 0 :(得分:41)

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

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

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

答案 1 :(得分:23)

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

w:

  

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

答案 5 :(得分:1)

不再需要时不会释放的内存,并且不再“可访问”。例如,在非托管代码中,如果我使用“new”来实例化一个对象,但是当我完成它时我不使用“删除”(并且我的指针已超出范围或某些东西)。

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

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

答案 6 :(得分:1)

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

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

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

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

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

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

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

答案 7 :(得分:1)

内存泄漏:无法释放您之前不再需要的内存:

  • 程序终止
  • 分配额外内存

防止内存泄漏的最佳方法:不再需要时释放内存。

答案 8 :(得分:1)

这里给出的所有定义(在我写这篇文章时,我们得到了更好的答案)未能解决一个边界情况:

你有一个在创建时分配内存的单例,只要程序正在运行,这个内存通常都会保持,即使当前使用已经完成,并且不知道将来是否会进行任何使用。这通常是因为重新创建它的开销。

通过“完成后无法释放”标准,这将被视为泄漏,我已经看到泄漏报告工具称这样的事情泄漏,因为内存仍在使用中。 (事实上​​,代码可能不包含能够清理对象的代码。)

但是,我在编译器库中遇到过这种性质的代码,即使重新创建对象的成本并不是那么好。

是否泄漏?

答案 9 :(得分:1)

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

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

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

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

答案 10 :(得分:-5)

编辑:这个答案错了​​。我把它留作一个例子,说明你认为自己非常清楚的事情是多么容易被误认为。感谢所有指出我错误的人。

内存泄漏是:编程错误。您的软件从系统中借用一些内存,使用它,然后在完成后无法将其返回系统。这意味着在重新引导系统之前,任何其他程序都不能使用该特定内存块。许多此类泄漏可能耗尽所有可用内存,从而导致完全无用的系统。

为了防止内存泄漏,请练习RIIA,并始终测试您的软件。有很多工具可用于此任务。