在Linux上用C语言作了一个程序,程序中申请(malloc)了很大的内存,但是没free,当程序运行结束后,内存是否自动释放?也可一这样说,当一个进程结束了,是否他的所有的内存资源都会自动释放呢?
main()
{
char *tmpstr=malloc(1024*1024*100);//申请100兆内存
}
当这个程序运行完后这100兆内存是否自动随进程结束而释放了呢?
|
会。 进程结束时,操作系统会回收该进程所申请的资源,关闭所有未关闭的句柄.
不过建议还是自己管理比较好。
|
分配给进程的资源同进程本身有相同的生命周期,
|
不会
用malloc和new分配的内存要自己用free和delete释放
不然会产生内存泄漏
|
目前只有solaris系统能够回收未被释放的内存。
在linux上用malloc和new分配的内存,如果不用free和delete释放,将会出现内存泄漏,该内存将不会被任何程序访问,如果大量的内存泄漏将耗尽系统内存资源,系统将崩溃,因此在开发商业软件是一定不能出现内存泄漏问题。
|
运行几次你的程序,然后用free看看就知道了!
|
这个肯定不会的!
|
会!但是如果是服务性的程序请释放。
要养成良好的编程习惯。
|
谁也不应该总是让别人为自己收拾残局。
|
一段时间内是不会的,最后linux 内存管理能够将它释放。
|
会。
进程结束后,操作系统帮你回收的没有释放的内存的。
SGI STL 标准库有自己设计构建器。为了避开内存碎片,SGI实现上,
当申请的内存空间小于1024bytes的时候,就是只有向操作系统申请,
却从不释放交还给操作系统,而是自己管理。等到进程结束了,一次释放。
|
一段时间内是不会的
|
其实,未被释放的内存是否被回收,是与操作系统内存管理的实现有关。例如你在Microsoft Windows和HP UNIX上不释放内存,该内存是永远不会被系统和应用程序再次使用。目前只有SUN solaris能够正确释放掉应用程序未释放的内存,至于linux是否也有这种功能,需要对它的内存管理进行研究,总之,开发软件时,必须用free或delete释放内存。
|
会...
不必讨论实现的原理机制,这是操作体统最基本的功能,试想一下,如果一个操作系统连这个都保证不了,那它如何保持操作系统的长期运行和稳定性?
|
楼上说的有利!!!!
|
再举一个例子,简单操作系统,如嵌入式操作系统VxWorks,如果在它上运行的程序如果出现内存泄露,VxWorks是无法收回该内存的。如果操作系统为了维护,上层应用产生的内存泄露异常所泄露的内存,它付出的代价将影响系统的实时性。因此,各个操作系统对于该系统的设计要求不同,对内存管理的实现是不同的。
许多商业软件都会用专业软件检测内存是否泄露,如rational purify.
这个问题没有必要再讨论下去,总之,开发可靠的商业软件必须防止内存泄露,释放掉不在实用的内存块。
|
to lovegreen(lovegreen):
兄弟,麻烦你搞清楚再说,在windows下,你申请的内存,如果你自己没有free调,在进程结束时,系统会释放的。因为内存也是与进程相关的资源,进程结束时,所有这个进程申请的资源都会释放,也包括内存,不管进程是正常结束还是异常终止。如果不信,自己写个小程序测试一下。
自己没搞清楚的,千万不要乱说,会误导的。
当然,自己的时最好自己干,自己申请的资源,最好自己释放,不能过分依赖系统。
|
我认为是会回收的。因为malloc 申请的应该是用户进程的内存空间,申请内核空间要用kmalloc。用户进程结束的时候,进程所有的空间都应该被OS自动释放,进程申请的内核资源应该不会被OS主动释放。但是自己释放是一个好习惯。分配100M这么大的空间应该对性能影响很大。比如STL的内存池,就只有先申请一次,一直没有释放。
|
大家有看过分页和虚拟内存么?我们malloc的内存,总是和process地址空间相关的。如果进程结束了,进程的地址空间还有意义么。
不管是堆还是栈,最终都会映射到物理内存页面上,释放与否,无非是一个标志位的问题。
我以为,写操作系统的人,这个基本功能总会实现吧。注意,这不是gc,这是在进程退出时执行
的操作,不涉及扫描,不会影响系统性能。
欢迎讨论,也希望有牛人能做出权威的解释。
|
没有调查就没有发言权:-}
我已在Windows和Xterm Linux上进行了测试,在程序未用free或delete释放的内存,确实在退出后被释放掉,但在HP-UX上的测试没有做。
谢谢,ddong,sttony,bnwxf及时提出疑异。
|
sco下有没有什么命令可以看到当前的可用内存是多少?