当程序终止使用非空闲的malloc分配的内存时';预计起飞时间?

当程序终止使用非空闲的malloc分配的内存时';预计起飞时间?,c,memory-leaks,malloc,free,valgrind,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 allocate

假设我有以下程序

#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;
}
问题:

当程序终止时,已分配但未释放的内存会发生什么变化

更新:
考虑到这个代码在不同的操作系统上执行,比如说Windows、Linux、Salix、MaOS等。在终止时,这个代码的行为有什么不同吗?

< P>程序一旦退出,操作系统就会恢复内存。 操作系统不知道你的程序泄漏了内存,它只是将内存分配给程序运行,一旦程序退出,它就会回收内存

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


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

O.S.将回收未释放的内存


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


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

  • 是的,内存是由操作系统回收的,因此从技术上讲,您不需要
    free()
    it
  • 这是一个很好的实践,不管怎样,释放你所失去的一切
  • 然而,重要的是要说明为什么
    free()
    您所处理的一切都是好的做法。我认为:

  • 习惯:如果你养成了在每次malloced时释放内存的习惯,你就不会意外地忘记在程序的生命周期中内存段不存在的情况
  • 可维护性:如果有人来重构您的程序,使某个内存段在程序的生命周期内不再存在,那么原始版本中存在清理代码意味着重构版本很可能也包含清理代码。对我来说,这是最重要的原因
  • 调试:如果我们希望所有内存都被正确清理,那么发现实际泄漏的内存就容易多了

  • 更重要的是,FREE确保了您分配的内存/缓冲区的完整性,因此存在一个很好的检查点来抑制/赶上堆损坏。

    在大多数现代操作系统中,所有程序资源都被释放或关闭。我能问一下是什么触发了这个问题吗?与其担心如果你不自由会发生什么,为什么不自由呢?这样你就不用担心了;valgrind发生了,大家都很高兴。问题解决了。我认为这是一个相当有效和有趣的问题:当进程退出时,O/s如何处理分配的内存(和其他资源?)?深入了解底层系统的工作方式,从虚拟内存系统分配页面。有很多东西需要学习(进程和内存管理,处理器中的虚拟内存)。尽管我知道答案,但这让我想知道“但是,它到底是如何工作的?”。你通过尝试去做你不该做的事情而学到了很多东西,而不是不去做,也不知道会有什么后果o) @MrLister我们不是故意跳过免费的。我们通常在庞大的代码库上工作,
    malloc
    是由一个模块完成的,
    free
    是由另一个模块完成的,等等。这些程序运行在windows、solaris、linux、mac os等平台上。因此,我很好奇未释放的情况是如何处理的。这是有争议的:;在程序终止之前为生产构建禁用显式释放可能是一个好主意。。。
    <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)