它是C中的内存泄漏吗?

Posted

技术标签:

【中文标题】它是C中的内存泄漏吗?【英文标题】:Is it a memory leak in C? 【发布时间】:2017-12-13 12:46:32 【问题描述】:

user:surendra nath 对此post 的回答指出,OP 发布的代码存在内存泄漏,而大多数情况下,当我们未能释放动态分配的内存时,就会发生泄漏区域,但我在 OPs 代码中看不到任何动态分配。 他引用了这个 wiki 定义,here。

user:artificial idiot 到post 的内存泄漏的另一个定义是:

微妙的定义:无法释放可达内存 您的程序需要更长的时间才能正常运行。这差不多 无法使用自动化工具或程序员检测到 不熟悉代码。虽然从技术上讲它不是泄漏,但它有 与幼稚的含义相同。这不仅仅是我自己的想法。 您可能会遇到写在垃圾收集器中的项目 语言,但仍然提到在其更改日志中修复内存泄漏。

所以,我的问题:

考虑到“人工白痴”或***给出的内存泄漏定义,“surendra nath”在 OPs 代码上所说的点是否可以说是内存泄漏?如果是,那为什么? C 中的内存泄漏是否总是指未能释放先前动态分配的内存?

附: - 我不知道 wiki 和 "artificial idiot" 的定义是否具有相同的含义,因为 wiki 的定义有时过于宽泛而无法理解。

【问题讨论】:

您所指的答案目前得分为-1。您可能会认为有用的证据;) 是的。我从来没有遇到过任何说内存泄漏只是由于 free() 东西失败的消息来源。而且,如果我引用的定义证实了他的回答,那将是有趣且信息丰富的信息。 我认为它不应该被否决。考虑到“人造白痴”的定义,至少有人可以解释为什么代码没有内存泄漏。如果我是 C 语言的大师,我永远不会问它。但我只是一个新手。 引用已释放的内存是一个错误,C 规范说这是未定义的行为。但这与内存泄漏是不同的错误。 @Barmar 能否提供一个特定 C 规范的参考链接? 【参考方案1】:

人工白痴在The Best Memory Leak Definition 中提出的问题有时会引起关注。假设你有一个程序做这样的事情:

    构造一个包含 100 万个动态分配对象的数组。 用那个数组做点什么。 构造另一个包含 100 万个动态分配对象的数组(不引用第一个数组中的任何内容)。 用那个数组做点什么。 释放第二个数组。 释放第一个数组。

在步骤 3-5 期间,第一个数组仍在使用内存,即使它的任何数据都不需要。结果,整个程序使用的总内存是它实际需要的两倍。如果它不再需要第 2 步之后,它应该释放第一个数组——然后它的内存可以重新用于第二个数组。

这是一种即使在垃圾收集语言中也可能发生的内存泄漏——如果持有对第一个数组的引用的变量没有被重新分配或超出范围,它将阻止所有数据GC'ed。

一个足够聪明的优化器理论上可以自动解决这个问题。如果它可以分析控制和数据流,并确定第 2 步之后第一个数组从未使用过,它可以将第 6 步重新排序到那个地方。但在许多情况下,编译器可能很难确定这一点。

编写模块化代码通常可以避免此类问题。如果您为处理每个数组创建单独的函数,则函数应该分配、使用和释放它们。

【讨论】:

题外话——我见过你的代表从大约 320k 到 280k 有好几次又回来了。知道那是什么意思吗? @dbush 我不确定你是怎么看到的。我已经超过 300K 有一段时间了,我的代表没有明显下降。

以上是关于它是C中的内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

fprintf 内存泄漏

Kotlin伴侣对象中的内存泄漏?

OpenGL VBO 会泄漏内存吗?

C++/CLI 库中的早期终结和内存泄漏

如何防止java中的内存泄漏

从未解决的承诺会导致内存泄漏吗?