最佳内存泄漏定义[关闭]

问题描述 投票:40回答:11

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

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

您对内存泄漏的最佳定义是什么?防止它们的最佳方法是什么?

memory-leaks definition
11个回答
43
投票

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

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

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


1
投票

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

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

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

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

泄漏与否?


-5
投票

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

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

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


24
投票

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


5
投票

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

虽然避免使用它们的最佳方法是通过努力观察代码执行路径和代码审查,但有些语言内置了一些方法来帮助防止它们。保持方法的简洁和独特的目的有助于保持资源使用的严格范围,并且不太容易在混乱中丢失。


5
投票

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


2
投票

w:

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


1
投票

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

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

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


1
投票

内存泄漏:在以下情况之前无法释放您不再需要的内存:

  • 该计划终止
  • 分配额外的内存

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


1
投票

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

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

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

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

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

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

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


1
投票

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

  1. 根据内存消耗考虑您的算法。其他受访者提到了这样一个事实,即您不必丢失指向已分配项目的指针以泄漏内存。即使您的实现包含零指针错误,如果您在实际需要它们之后很久就保留已分配的项目,仍然可以有效地泄漏内存。
  2. 描述你的申请。您可以使用Valgrind或Purify等内存调试工具来查找泄漏。
  3. 黑盒测试。观察编译后的代码在为大型数据集提供数据集后会发生什么情况,或允许其长时间运行。看看它的内存占用量是否有无限增长的趋势。
© www.soinside.com 2019 - 2024. All rights reserved.