假设我有以下C代码:
int main () {
int *p = malloc(10 * sizeof *p);
*p = 42;
return 0; //Exiting without freeing the allocated memory
}
当我编译和执行C程序时,即在内存中分配了一些空间后,在我退出应用程序和进程终止后,我分配的内存还会被分配(即基本上占用空间)吗?
发布于 2010-02-06 23:40:50
这取决于操作系统。大多数现代(和所有主要的)操作系统都会释放内存,而不是程序结束时释放的内存。
依赖这一点是不好的做法,最好显式地释放它。问题不仅仅是你的代码看起来很糟糕。您可能会决定将您的小程序集成到一个较大的、长期运行的程序中。过了一段时间,你不得不花几个小时来追踪内存泄漏。
依赖操作系统的一个特性也会降低代码的可移植性。
发布于 2011-11-10 02:26:52
很抱歉在上一篇帖子后这么久才在这个帖子上发帖。
另外还有一点。并不是所有的程序都能优雅地退出。崩溃和ctrl-C等会导致程序以不受控制的方式退出。如果你的操作系统没有释放你的堆,清理你的堆栈,删除静态变量等等,你最终会因为内存泄漏或更糟的情况而使你的系统崩溃。
有趣的是,Ubuntu中的崩溃/中断,以及我怀疑所有其他现代OSes,确实存在“已处理”资源的问题。当程序结束/崩溃时,套接字、文件、设备等可以保持“打开”状态。在优雅退出之前,最好关闭任何带有“句柄”或“描述符”的东西作为清理的一部分。
我目前正在开发一个大量使用套接字的程序。当我被挂起的时候,我不得不按ctrl-c离开它,这样,我的套接字就搁浅了。我添加了一个std::vector来收集所有打开的套接字的列表,并添加了一个sigaction处理程序来捕获sigint和sigterm。处理程序遍历列表并关闭套接字。我计划做一个类似的清理例程,在抛出之前使用,这将导致提前终止。
有人想对这个设计发表意见吗?
发布于 2010-02-06 23:40:16
是。操作系统清理资源。好吧..。旧版本的NetWare没有。
编辑:正如San Jacinto指出的那样,肯定有一些系统(除了NetWare)不能做到这一点。即使是在一次性程序中,我也会努力养成释放所有资源的习惯,只为了保持这个习惯。
https://stackoverflow.com/questions/2213627
复制相似问题