堆内存分配

15 c memory malloc dynamic-memory-allocation

如果我在我的程序中使用动态分配内存malloc()但在程序运行时没有释放内存,那么在程序终止后是否会释放动态分配的内存?

或者如果它没有被释放,并且我一遍又一遍地执行相同的程序,它每次都会分配不同的内存块吗?如果是这样的话,我应该如何释放这段记忆?

注意:我能想到的一个答案是重新启动我正在执行程序的机器.但是,如果我在远程计算机上执行程序并且重启不是一个选项?

sta*_*ica 19

简短回答:一旦您的进程终止,任何合理的操作系统都将释放该进程分配的所有内存.所以不,当您多次重新启动进程时,内存分配不会累积.


进程和内存管理通常是操作系统的责任,因此在进程终止后是否释放已分配的内存实际上取决于操作系统.不同的操作系统可以不同地处理内存管理

话虽这么说,任何合理的操作系统(尤其是多任务操作系统)都将释放进程终止后进程分配的所有内存.

我假设这背后的原因是操作系统必须能够优雅地处理不规则的情况:

  • 恶意程序(例如那些不会故意释放内存的程序,希望影响它们运行的​​系统)
  • 异常程序终止(即程序意外结束的情况,因此可能无法明确free其动态分配的内存本身)

任何值得盐的操作系统都必须能够处理这种情况.它必须将系统的其他部分(例如自身和其他运行过程)与故障过程隔离开来.如果没有,进程的内存泄漏将传播到系统.这意味着操作系统会泄漏内存(通常被认为是一个错误).

保护系统免受内存泄漏的一种方法是确保一旦进程结束,就可以释放它使用的所有内存(以及可能的其他资源).


Mur*_*nik 8

分配给程序的任何内存都应在程序终止时释放,无论是静态分配还是动态分配.对此的主要例外是如果进程分叉到另一个进程.

如果您没有明确free任何内存malloc,它将保持分配,直到该过程终止.

  • @RohitSaluja _compiler_没有释放程序的内存.正如Mureinik的回答所说:当进程终止时,操作系统会释放它的内存. (2认同)