Memory leaks 最佳内存泄漏定义

Memory leaks 最佳内存泄漏定义,memory-leaks,definition,Memory Leaks,Definition,我觉得开发人员在谈论内存泄漏,但当你问他们这意味着什么时,很多人都不知道。为了避免这些情况,让我们决定一个 请不要使用维基百科定义 你对a的最佳定义是什么 内存泄漏最好的方法是什么 为了防止它们 定义:分配后未能释放内存 分配内存资源的过程,一旦不再需要,就不能适当地释放内存资源,通常是通过错误的编码实践引入的 有些语言中有内置的方法来帮助防止它们,尽管避免它们的最佳方法是通过仔细观察代码执行路径和代码检查。保持方法简短且目的明确有助于保持资源使用范围的严格限制,并减少在洗牌过程中丢失的可能性。

我觉得开发人员在谈论内存泄漏,但当你问他们这意味着什么时,很多人都不知道。为了避免这些情况,让我们决定一个

请不要使用维基百科定义

你对a的最佳定义是什么 内存泄漏最好的方法是什么 为了防止它们


定义:分配后未能释放内存

分配内存资源的过程,一旦不再需要,就不能适当地释放内存资源,通常是通过错误的编码实践引入的


有些语言中有内置的方法来帮助防止它们,尽管避免它们的最佳方法是通过仔细观察代码执行路径和代码检查。保持方法简短且目的明确有助于保持资源使用范围的严格限制,并减少在洗牌过程中丢失的可能性。

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

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


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

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

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

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

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

第二,如果上次使用时未释放/删除内存,则内存基本上会泄漏。它可以被引用,并且可以立即释放,但是错误是没有这样做。可能有一个合理的原因(例如,在析构函数有一些奇怪的副作用的情况下),但这表明程序设计不好(在我看来)

第二种类型的内存泄漏通常发生在编写使用文件IO的小程序时。打开文件,写入数据,但完成后不要关闭。文件*可能仍在范围内,并且易于关闭。同样,这样做可能有一些原因(比如锁定其他程序的写访问),但对我来说,这是糟糕设计的标志


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

分配的内存无法使用,因为对它的引用已丢失。

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

内存泄漏是:编程错误。您的软件从系统借用了一些内存,并使用了它,但在完成后无法将其返回到系统。这意味着,在系统重新启动之前,该特定内存块永远不能被任何其他程序使用。许多这样的泄漏可能会耗尽所有可用内存,导致系统完全无用

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

内存泄漏:无法释放不再需要的内存,请执行以下任一操作:

  • 程序终止
  • 额外的内存被分配
防止内存泄漏的最佳方法:在不再需要时立即释放内存。

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

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


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

此处给出的所有定义(在我撰写本文时,我们得到了更好的答案)都无法解决一个临界情况:

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

根据“完成时无法释放”标准,这将被视为泄漏,我见过泄漏报告工具称这类事情为泄漏,因为内存仍在使用中。(事实上,该守则可能不包含