c - 是C语言的内存泄漏吗?

标签 c memory-management memory-leaks

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

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

Subtle definition: Failure to release reachable memory which is no longer needed for your program to function correctly. This is nearly impossible to detect with automated tools or by programmers who are not familiar with the code. While technically it is not a leak, it has the same implications as the naive one. This is not my own idea only. You can come across projects that are written in a garbage collected language but still mention fixing memory leaks in their changelogs.

所以,我的问题:

  • 考虑到“artificial idiot”或维基百科给出的内存泄漏定义,OPs代码中“surendra nath”所说的观点是否可以说是内存泄漏?如果是这样,那为什么?
  • C 中的内存泄漏是否总是指未能释放先前动态分配的内存?

附注- 我不知道维基百科和“人工白痴”的定义是否具有相同的含义,因为维基百科的定义有时太宽泛而难以理解。

最佳答案

人工白痴在The Best Memory Leak Definition中提出的问题有时可能是一个问题。假设您有一个程序执行以下操作:

  1. 构造一个包含 100 万个动态分配对象的数组。
  2. 对该数组执行一些操作。
  3. 构造另一个包含 100 万个动态分配对象的数组(不引用第一个数组中的任何内容)。
  4. 对该数组执行一些操作。
  5. 释放第二个数组。
  6. 释放第一个数组。

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

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

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

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

关于c - 是C语言的内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45000938/

相关文章:

C++:在实例化类成员时使用 new 关键字与不使用关键字之间的区别?

在 Makefile 中处理链接的正确方法?

c - char *a[10]; 之间的区别和 char (*a)[10];

c++ - 树状结构中的内存前向预留

c++ - float 组是否总是与 16 字节边界对齐?

ios - 删除 MKMapView 注解会导致泄漏

c++ - 如何在每个共享库中使用自己的静态库拷贝

c++ - 使用 -static-libgcc -static-libstdc++ 编译仍然会导致对 libc.so 的动态依赖

c++ - 删除之前删除的内存

c# - 与 lambda 一起使用的弱事件处理程序模型