当一个程序终止使用不是免费的malloc分配的内存时会发生什么?

时间:2012-04-19 07:44:05

标签: c memory-leaks malloc free valgrind

说我有以下程序

#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等。这个代码在终止期间的行为有什么不同吗?

5 个答案:

答案 0 :(得分:13)

其他答案告诉你两个重要的事情:

  1. 是的,操作系统会回收内存,因此您技术上需要free()
  2. 无论如何都要释放你所提出的所有内容,这是一种很好的做法。
  3. 然而,重要的是要说明为什么free()所有你提出来的东西都是好的做法。在我看来:

    1. 习惯:如果你习惯于在每次进行游戏时都能解放,那么在程序的生命周期内你不会意外忘记内存段的存在。
    2. 可维护性:如果有人来重构您的程序,以便在程序的生命周期内不再存在一段内存,原始清单代码的存在将意味着它非常可能重构版本还包括清理代码。对我来说,这是最重要的原因。
    3. 调试:如果我们希望所有内存都能正确清理,那么发现实际泄漏的内存要容易得多。

答案 1 :(得分:7)

O.S。将回收未被释放的记忆。

但释放malloc

分配的所有内存是一种很好的做法

答案 2 :(得分:4)

程序退出后,操作系统将回收内存 操作系统不了解您的程序泄漏内存,它只是将内存分配给程序进行运行,一旦程序退出就回收内存。

但是,操作系统可能会/可能不会重新调整文件描述符等其他资源,从而导致资源泄漏。

因此,一个好的做法是程序在退出之前应该清理它所使用的所有资源。

答案 3 :(得分:1)

当进程动态分配内存时,它会从OS借用内存块。当一个进程不需要分配内存时,它就会释放。然后OS将这些块添加到其空闲列表中。当进程终止时也会发生同样的情况。该过程使用的所有块都由操作系统回收。

Read memory-management for more info.

答案 4 :(得分:0)

更重要的是,FREE确保您分配的内存/缓冲区的健全性,从而存在一个良好的检查点来阻止/追赶堆损坏。