退出C应用程序时,是否会自动释放malloc-ed内存?

退出C应用程序时,是否会自动释放malloc-ed内存?,c,memory-management,C,Memory Management,假设我有以下C代码: int main () { int *p = malloc(10 * sizeof *p); *p = 42; return 0; //Exiting without freeing the allocated memory } 当我编译并执行该C程序时,即在内存中分配了一些空间后,在我退出应用程序并且进程终止后,我分配的内存是否仍会被分配(即基本上占用空间) 是的。操作系统会清理资源。好。。。旧版本的NetWare没有 编辑:正如San Jacinto指出

假设我有以下C代码:

int main () {
  int *p = malloc(10 * sizeof *p);
  *p = 42;
  return 0;  //Exiting without freeing the allocated memory
}

当我编译并执行该C程序时,即在内存中分配了一些空间后,在我退出应用程序并且进程终止后,我分配的内存是否仍会被分配(即基本上占用空间)

是的。操作系统会清理资源。好。。。旧版本的NetWare没有


编辑:正如San Jacinto指出的,肯定有一些系统(除了NetWare)不这样做。即使是在扔掉的项目中,我也试着养成一种习惯,释放所有资源只是为了保持这个习惯。

是的。操作系统会清理资源。好。。。旧版本的NetWare没有


编辑:正如San Jacinto指出的,肯定有一些系统(除了NetWare)不这样做。即使在扔掉的程序中,我也试着养成一种习惯,释放所有资源,只是为了保持这个习惯。

这确实取决于操作系统,但对于您遇到的所有操作系统,当进程退出时,内存分配将消失。

这确实取决于操作系统,但是对于您遇到的所有操作系统,当进程退出时,内存分配将消失。

是的,当进程结束时,操作系统释放所有内存。

是的,当进程结束时,操作系统释放所有内存。

这取决于操作系统。大多数现代(和所有主要)操作系统都会在程序结束时释放程序未释放的内存

依赖这一点是不好的做法,最好明确地释放它。问题不仅仅是你的代码看起来很糟糕。您可能决定将您的小程序集成到一个更大的、长期运行的程序中。然后一段时间后,您必须花费数小时跟踪内存泄漏。

依赖操作系统的功能也会降低代码的可移植性。

这取决于操作系统。大多数现代(和所有主要)操作系统都会在程序结束时释放程序未释放的内存

依赖这一点是不好的做法,最好明确地释放它。问题不仅仅在于你的代码看起来很糟糕。您可能决定将您的小程序集成到一个更大的、长期运行的程序中。然后一段时间后,您必须花费数小时跟踪内存泄漏。

依赖操作系统的功能也会降低代码的可移植性。

视情况而定,操作系统通常会为您清理代码,但如果您正在开发嵌入式软件,则可能不会发布


只要确保您将其释放出来,以后您可能希望将其集成到大型项目中时,它可以为您节省大量时间。

视情况而定,操作系统通常会为您清理它,但如果您正在开发嵌入式软件,那么它可能不会发布

只要确保您将其释放,以后您可能希望将其集成到大型项目中时,它可以为您节省大量时间。

这里发生的事情(在现代操作系统中)是您的程序在其自己的“进程”中运行。这是一个操作系统实体,具有自己的地址空间、文件描述符、,等等。
malloc
调用正在从“堆”或分配给进程的未分配内存页分配内存

当程序结束时,如本例所示,分配给流程的所有资源都会被操作系统回收/拆除。在内存的情况下,分配给您的所有内存页都被简单地标记为“空闲”,并循环使用以供其他进程使用。页面是一个比malloc处理的概念级别更低的概念——因此,随着整个事情的清理,malloc/free的细节都被简单地冲走了

这在道德上相当于,当你用完笔记本电脑并想把它送给朋友时,你不必逐个删除每个文件。你只需要格式化硬盘

正如所有其他回答者所指出的那样,所有这些都表明,依靠这一点不是好的做法:

  • 您应该始终进行编程来管理资源,在C语言中,这意味着内存。您可能最终将代码嵌入到库中,或者它的运行时间可能比您预期的要长得多
  • 一些操作系统(旧的和现代的嵌入式操作系统)可能无法保持这样的硬进程边界,您的分配可能会影响其他操作系统的地址空间
  • 这里发生的事情(在现代操作系统中)是您的程序在其自己的“进程”内运行。这是一个操作系统实体,具有自己的地址空间、文件描述符等。您的
    malloc
    调用正在从“堆”中分配内存,或分配给您的进程的未分配内存页

    当程序结束时,如本例所示,分配给流程的所有资源都会被操作系统回收/拆除。在内存的情况下,分配给您的所有内存页都被简单地标记为“空闲”,并循环使用以供其他进程使用。页面是一个比malloc处理的概念级别更低的概念——因此,随着整个事情的清理,malloc/free的细节都被简单地冲走了

    这在道德上相当于,当你用完笔记本电脑并想把它送给朋友时,你不必逐个删除每个文件。你只需要格式化硬盘

    正如所有其他回答者所指出的那样,所有这些都表明,依靠这一点不是好的做法:

  • 您应该始终进行编程来管理资源,在C语言中,这意味着内存。您可能最终将代码嵌入到库中,或者它的运行时间可能比您预期的要长得多
  • 一些操作系统(旧的和现代的嵌入式操作系统)可能无法保持这样的硬进程边界,您的分配可能会影响其他操作系统的地址空间
  • 一般来说,