C异常终止程序导致的潜在内存泄漏 [英] C potential memory leak caused by abnormally terminating program
本文介绍了C异常终止程序导致的潜在内存泄漏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Windows和Linux。
当我在C程序中分配内存时,良好的编码要求我在程序结束前释放内存。
假设:
int main (int argc, char *argv[]) {
char *f_name;
FILE *i_file;
f_name = malloc(some_amount);
// put something in f_name */
i_file = fopen(f_name, "r");
if (i_file == NULL) {
perror("Error opening file.");
exit(EXIT_FAILURE);
}
free(f_name);
return EXIT_SUCCESS;
}
如果程序在我调用"Free"之前终止,当程序退出时,操作系统是否会恢复任何未释放的内存?或者,在系统重新启动之前,我是否会一点点地占用大约3 GB的可用内存?
谢谢,马克。
推荐答案
您不必担心Windows和LINUX等流行操作系统上的问题。
进程终止时,虚拟内存将不复存在。因此,它不可能在进程终止后泄漏。 物理内存始终属于操作系统,可以随心所欲地分配,无论您的进程是否仍在运行。(除非您锁定您的分配,在这种情况下,当相应的虚拟内存映射被破坏时,它将不再被锁定,这无论如何都会在进程终止时发生。)有一些资源未清理(如某些类型的共享内存),但这很奇怪。
当您调用malloc
时,通常只保留后备存储(本质上是RAM+交换),并创建虚拟内存映射(本质上是空闲的)。当您第一次写入该虚拟内存映射时,物理内存页面(RAM)会被映射到该虚拟内存映射中以"支持"它。该RAM始终属于操作系统,可以随心所欲地使用,如果操作系统认为明智,它会将RAM重新用于其他目的。
当进程终止时,其地址空间将不复存在。这意味着任何虚拟内存映射或保留都会消失。当虚拟内存映射消失时,非共享物理页面的使用计数将降至零,从而释放这些物理内存页面。
详细了解这一点是值得的,因为如果您不了解幕后情况,很容易得出关于边缘情况的错误结论。此外,这还将为您提供一个框架,将文件映射、内存过量使用和共享内存等概念插入其中。
这篇关于C异常终止程序导致的潜在内存泄漏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文