如果您在程序终止前的malloc之后没有空闲,会发生什么情况? [英] What REALLY happens when you don't free after malloc before program termination?
本文介绍了如果您在程序终止前的malloc之后没有空闲,会发生什么情况?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我们都被教导必须释放分配的每个指针。不过,我对不释放内存的实际成本有点好奇。在一些明显的情况下,比如在循环或线程执行的一部分内调用malloc()
时,释放内存是非常重要的,这样就不会有内存泄漏。但请考虑以下两个示例:
首先,如果我有如下代码:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
这里的实际结果是什么?我的想法是,进程结束,然后堆空间无论如何都会消失,所以错过对free
的调用没有什么坏处(但是,我确实认识到无论如何拥有它对于闭合、可维护性和良好实践的重要性)。我这样想对吗?
aaa = 123
这样的变量,这些变量存储在某种动态数据结构中以备后用。显然,您显然会使用某种解决方案来调用某些*alloc函数(哈希图、链表,诸如此类)。对于这类程序,在调用malloc
之后释放是没有意义的,因为在程序执行期间这些变量必须始终存在,并且没有好的方法(我可以看到)使用静态分配的空间来实现这一点。让一堆已分配但仅在进程结束时释放的内存是不是糟糕的设计?如果是,还有什么替代方案?
推荐答案
几乎每个现代操作系统都会在程序退出后恢复所有分配的内存空间。我能想到的唯一例外可能是PalmOS,在那里程序的静电存储和运行时内存几乎是一样的,所以不释放可能会导致程序占用更多的存储。(我在这里只是猜测。)
因此,一般来说,它没有什么坏处,除了拥有比所需更多的存储所带来的运行时成本。当然,在您给出的示例中,您希望为可能使用的变量保留内存,直到它被清除。
但是,在不再需要内存时立即释放内存,并在程序退出时释放所有剩余内存,这被认为是一种很好的方式。它更像是一种练习,目的是了解您正在使用的内存,并考虑您是否仍然需要它。如果您不跟踪,可能会有内存泄漏。 另一方面,在退出时关闭文件的类似警告会产生更具体的结果-如果您不这样做,您写给它们的数据可能不会刷新,或者如果它们是临时文件,它们可能不会在您完成时被删除。此外,数据库句柄应该提交它们的事务,然后在您处理完它们时关闭它们。同样,如果您使用的是面向对象的语言(如C++或Objective C),在使用完对象后不释放它将意味着析构函数永远不会被调用,并且类负责的任何资源都可能不会被清除。这篇关于如果您在程序终止前的malloc之后没有空闲,会发生什么情况?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文