c - malloc 没有相应的 free 是否总是会产生内存泄漏?

标签 c memory-leaks malloc free

没有相应的 freemalloc 是否总是会产生内存泄漏,或者是否存在不会产生内存泄漏的情况?

最佳答案

这取决于你如何定义“内存泄漏”。如果您将其定义为在程序退出时具有分配的存储持续时间的任何未完成对象,那么是的,这是泄漏。这就是 valgrind 等工具的报告。然而,这根本不是一个有用的定义。

我对内存泄漏的定义大致是程序在其生命周期内总内存消耗的无限增加,尽管工作集是有限的。例如,如果我总是在浏览器中打开最多 10 个选项卡,访问相同的 10 个站点,但内存使用量不断增加,那就是内存泄漏。另一方面,分配缓冲区将整个文件加载到内存中,加载文件,反向打印,然后退出而不释放内存的程序不会发生内存泄漏。

一个特别重要的情况,没有 freemalloc 不仅不是泄漏,而且是绝对必要的(对于无法对整体做出假设的一般代码)运行时的程序)是运行时分配的常量表的任何使用,其生成由call_once控制。无论您尝试释放此类表的时间有多晚,代码(在另一个线程或 atexit 处理程序等中)都可能在释放后尝试访问它,并且 call_once 类型接口(interface)故意不提供任何方法来同步除第一次调用之外的任何访问(这就是它们避免在每次读取时引入不需要的获取障碍/同步成本的方法)。

请注意,这里“工作集”的概念有些主观,而且承载力很高。通常,内存泄漏是由于当用户不再考虑其工作集的某些部分时,软件仍然考虑它的问题。

关于c - malloc 没有相应的 free 是否总是会产生内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59014119/

相关文章:

c - 通过指针在 func 内进行内存(重新)分配

c - 第 15 位数字后小数精度丢失 - PI 错误

c - 为什么这个涉及下取整函数的公式没有给出我期望的结果?

c - 什么时候需要 volatile 指针?

Apache Harmony 的 JarURLConnectionImpl 中的 Android 内存泄漏?

c++ - 这会导致 C++ 中的内存泄漏吗?

java - 没有 JDK 的 JRE 6 (Windows) 上的堆转储

c - 如何在 Windows 和 VS 2010 上开始使用 ANTLR 生成 C

c++ - 新建、删除、malloc 和免费

C malloc 字符串结构数组