由网友(阳光老猫)分享简介:Windows和Linux。当我在C程序中分配内存时,良好的编码要求我在程序结束前释放内存。假设:int main (int argc, char *argv[]) {char *f_name;FILE *i_file;f_name = malloc(some_amount);// put something in f...
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重新用于其他目的。
当进程终止时,其地址空间将不复存在。这意味着任何虚拟内存映射或保留都会消失。当虚拟内存映射消失时,非共享物理页面的使用计数将降至零,从而释放这些物理内存页面。
详细了解这一点是值得的,因为如果您不了解幕后情况,很容易得出关于边缘情况的错误结论。此外,这还将为您提供一个框架,将文件映射、内存过量使用和共享内存等概念插入其中。
相关推荐
最新文章