malloc
没有相应的free
会不会总是导致内存泄漏,还是有情况下不会产生内存泄漏呢?
malloc
没有相应的free
会不会总是导致内存泄漏,还是有情况下不会产生内存泄漏呢?
call_once
控制生成的运行时分配常量表的任何代码(对于不能做出关于其运行环境的任何假设的通用代码)都不仅不是泄漏,而且绝对必要。无论您多晚尝试释放这些表格,都有可能有代码(在另一个线程、或者是atexit
处理程序等)在释放后尝试访问它,而call_once
类型的接口故意不提供任何同步任何访问的方法,除了第一次调用(这是它们避免在每次读取时引入不希望的获取屏障/同步成本的方式)。malloc
的实现,但通常有两种情况下,我们期望malloc
不会产生内存泄漏:
当您将0作为大小参数传递时,某些实现将只返回NULL
而不分配任何内容,而其他实现将返回一个唯一的指针,即使这被视为未分配任何字节,您仍将泄漏大约64个字节的记录。
当发生内存不足时。检查全局变量errno
以获得特定值,通常为ENOMEM
,以查看是否失败。在这种情况下,malloc
也会返回NULL
。
标准并不要求任何内存泄漏。因此,本身没有任何情况可以保证内存泄漏。
另一方面,标准也不要求在您提到的情况下不发生内存泄漏。
在大多数情况下,程序退出时,所有分配的内存都将被释放。但是,在某些系统(特别是嵌入式系统)上可能会有例外情况。如果这对于您的程序很重要,则不应依赖它。
malloc
和free
可以在不同的函数中使用,或者一个free
命令行可以执行多次来释放在代码不同部分分配的多个块等)。此外,当程序退出时,剩余分配的任何内容通常都会被释放。 - Dmitrimalloc
等的调用次数应该与对free
的调用次数相匹配,但不一定与源代码中的出现次数相匹配。 - Dmitrirealloc(malloc(1000),0)
可以在没有free()
的情况下释放已分配的内存。 - chux - Reinstate Monica