gpt4 book ai didi

程序异常终止导致的 C 潜在内存泄漏

转载 作者:行者123 更新时间:2023-11-30 18:15:02 25 4
gpt4 key购买 nike

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”之前终止,那么当程序退出时操作系统会恢复任何未释放的内存吗?或者我会消耗 3Gb 左右的可用内存直到系统重新启动吗?

谢谢,马克。

最佳答案

在 Windows 和 Linux 等流行操作系统上,您不必担心这个问题。

当进程终止时,虚拟内存将不再存在。因此进程终止后不可能发生泄漏。

物理内存始终属于操作系统,可以随意分配,无论您的进程是否仍在运行。 (除非您锁定分配,在这种情况下,当相应的虚拟内存映射被破坏时,分配将不再被锁定,无论如何,这都会在进程终止时发生。)

有一些资源没有被清理(例如某些类型的共享内存),但这非常奇怪。

当您调用malloc时,通常只保留后备存储(本质上是RAM+交换)并创建虚拟内存映射(本质上是免费的)。当您第一次写入该虚拟内存映射时,物理内存页 (RAM) 会被映射到其中以“返回”它。该 RAM 始终属于操作系统,可以随意使用,并且如果操作系统认为明智的话,它会将 RAM 重新用于其他目的。

当进程终止时,其地址空间不再存在。这意味着任何虚拟内存映射或保留都会消失。当虚拟内存映射消失时,非共享物理页的使用计数将降至零,从而使这些物理内存页空闲。

值得详细了解这一点,因为如果您不了解幕后情况,您很容易得出关于边缘情况的错误结论。此外,这将为您提供一个框架来插入文件映射、内存过量使用和共享内存等概念。

关于程序异常终止导致的 C 潜在内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42569493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com