它是C中的内存泄漏吗?

时间:2017-07-09 20:56:42

标签: c memory-management memory-leaks

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

user:artificial idiotpost的内存泄漏的另一个定义是:

  

微妙的定义:无法释放可到达的内存,但没有   程序正常运行所需的时间更长。这差不多了   用自动化工具或程序员无法检测到   不熟悉代码。虽然从技术上说它不是泄漏,但它有   与天真的相同。这不仅仅是我自己的想法。   您可以遇到使用垃圾收集的项目   语言,但仍然提到修改内存泄漏的更改日志。

所以,我的问题:

  • 请注意" surendra nath"关于OPs代码,考虑到"人工白痴"给出的内存泄漏的定义,可以说是内存泄漏。还是维基百科?如果是这样,为什么呢?
  • C中的内存泄漏是否始终指的是无法释放先前动态分配的内存?

P.S。 - 我不知道wiki和amp;的定义是否合适。 "人工白痴"具有相同的含义,因为维基定义有时太宽泛而无法理解。

1 个答案:

答案 0 :(得分:2)

The Best Memory Leak Definition中人为白痴提出的问题有时可能是一个问题。假设你有一个类似这样的程序:

  1. 构建一个包含100万个动态分配对象的数组。
  2. 使用该数组执行某些操作。
  3. 构造另一个包含100万个动态分配对象的数组(不引用第一个数组中的任何内容)。
  4. 使用该数组执行某些操作。
  5. 释放第二个阵列。
  6. 释放第一个阵列。
  7. 在步骤3-5期间,第一个阵列仍在使用内存,即使它不需要任何数据。因此,整个程序使用的内存总量是实际需要的两倍。如果它不再需要它,它应该在第2步之后释放第一个数组 - 然后它的内存可以重用于第二个数组。

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

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

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