说我有以下程序
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * i;
if ((i = malloc(sizeof(int) * 100)) == NULL) {
printf("EROOR: unable to allocate memory \n");
return -1;
}
/* memory is allocated successfully */
/* memory is not free'ed but program terminates */
// free(i);
return 0;
}
上述程序调用{{1}}来分配一些内存,而不是调用malloc
来取消分配它。程序终止而不取消分配内存。
Valgrind清楚地发现内存泄漏。
free
问题:
当程序终止时,分配但不是<snap>
==14209== HEAP SUMMARY:
==14209== in use at exit: 400 bytes in 1 blocks
==14209== total heap usage: 1 allocs, 0 frees, 400 bytes allocated
==14209==
<sanp>
==14209== LEAK SUMMARY:
==14209== definitely lost: 400 bytes in 1 blocks
==14209== indirectly lost: 0 bytes in 0 blocks
==14209== possibly lost: 0 bytes in 0 blocks
==14209== still reachable: 0 bytes in 0 blocks
==14209== suppressed: 0 bytes in 0 blocks
==14209==
==14209== For counts of detected and suppressed errors, rerun with: -v
==14209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
'的内存会发生什么?
更新: 考虑到这个代码是在不同的操作系统上执行的 - 比如windows,linux,solarix,macos等。这个代码在终止期间的行为有什么不同吗?
答案 0 :(得分:13)
其他答案告诉你两个重要的事情:
free()
。然而,重要的是要说明为什么对free()
所有你提出来的东西都是好的做法。在我看来:
答案 1 :(得分:7)
O.S。将回收未被释放的记忆。
但释放malloc
答案 2 :(得分:4)
程序退出后,操作系统将回收内存 操作系统不了解您的程序泄漏内存,它只是将内存分配给程序进行运行,一旦程序退出就回收内存。
但是,操作系统可能会/可能不会重新调整文件描述符等其他资源,从而导致资源泄漏。
因此,一个好的做法是程序在退出之前应该清理它所使用的所有资源。
答案 3 :(得分:1)
当进程动态分配内存时,它会从OS借用内存块。当一个进程不需要分配内存时,它就会释放。然后OS将这些块添加到其空闲列表中。当进程终止时也会发生同样的情况。该过程使用的所有块都由操作系统回收。
答案 4 :(得分:0)
更重要的是,FREE确保您分配的内存/缓冲区的健全性,从而存在一个良好的检查点来阻止/追赶堆损坏。