首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当您退出C应用程序时,是否会自动释放malloc-ed内存?

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

Stack Overflow用户
提问于 2010-02-06 23:37:22
回答 7查看 40.3K关注 0票数 107

假设我有以下C代码:

代码语言:javascript
复制
int main () {
  int *p = malloc(10 * sizeof *p);
  *p = 42;
  return 0;  //Exiting without freeing the allocated memory
}

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-06 23:40:50

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

依赖这一点是不好的做法,最好显式地释放它。问题不仅仅是你的代码看起来很糟糕。您可能会决定将您的小程序集成到一个较大的、长期运行的程序中。过了一段时间,你不得不花几个小时来追踪内存泄漏。

依赖操作系统的一个特性也会降低代码的可移植性。

票数 131
EN

Stack Overflow用户

发布于 2011-11-10 02:26:52

很抱歉在上一篇帖子后这么久才在这个帖子上发帖。

另外还有一点。并不是所有的程序都能优雅地退出。崩溃和ctrl-C等会导致程序以不受控制的方式退出。如果你的操作系统没有释放你的堆,清理你的堆栈,删除静态变量等等,你最终会因为内存泄漏或更糟的情况而使你的系统崩溃。

有趣的是,Ubuntu中的崩溃/中断,以及我怀疑所有其他现代OSes,确实存在“已处理”资源的问题。当程序结束/崩溃时,套接字、文件、设备等可以保持“打开”状态。在优雅退出之前,最好关闭任何带有“句柄”或“描述符”的东西作为清理的一部分。

我目前正在开发一个大量使用套接字的程序。当我被挂起的时候,我不得不按ctrl-c离开它,这样,我的套接字就搁浅了。我添加了一个std::vector来收集所有打开的套接字的列表,并添加了一个sigaction处理程序来捕获sigint和sigterm。处理程序遍历列表并关闭套接字。我计划做一个类似的清理例程,在抛出之前使用,这将导致提前终止。

有人想对这个设计发表意见吗?

票数 14
EN

Stack Overflow用户

发布于 2010-02-06 23:40:16

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

编辑:正如San Jacinto指出的那样,肯定有一些系统(除了NetWare)不能做到这一点。即使是在一次性程序中,我也会努力养成释放所有资源的习惯,只为了保持这个习惯。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2213627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档