C异常终止程序导致的潜在内存泄漏 [英] C potential memory leak caused by abnormally terminating program

查看:0
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆