今天看到有mallc后没有free的例子,就觉得是不是main函数执行完也自动回收?后来问了一些人,回答中有说不会,有说看操作系统,有点迷

突然想到平时做OJ碰到建树使用new 但后面没有delete,是不是会发生内存泄露?


主函数结束后,进程结束,该进程的所有内存被操作系统回收,当然包括malloc申请到的那些内存。

但这不代表你写了malloc就不用写free,这是一个非常糟糕的习惯,每个malloc都必须要有对应的free


main函数退出,就没你的事了……

你说操作系统要不要回收?

就算不回收,放著占据内存空间?

那你关闭程序的意义何在?

所以,正常的系统都会自动回收……(我不排除特例)


内存属于进程,进程不存在内存也就不在了。


如果主函数执行完毕,那么程序相当于结束了。系统是会把占用的内存释放的,但是问题在于你用malloc一定要有free的习惯。因为你不释放,那块空间在主函数没结束运行前一直存在。增加了计算机消耗,你malloc的空间小还好。要是在循环中,次数大了,将会严重影响计算机性能和执行效率。


作为C程序员,内存分配了要释放,时刻记住你不是C#和java,有个土豪的爹后边收集,我们C程序员都是自己当家,对油米贵有切身体,钢要用到刀刃上,你可能永远体会不到,为什么一个位元组我还分八瓣.为什么明明是链表,为什么用数组实现,为什么明明看上去应该使用Map却使用数组、其是我不是抠门,我只是爱你爱的太深.


对于竞赛而言,操心「main函数执行完」之后的事情作甚?跟你半点关系都没有。

既然你好奇,下面回答你

【是不是main函数执行完也自动回收?】

是。


会的。程序关闭以后操作系统会回收其占用的所有资源。不然程序小白写的代码会把系统占满,就必须要重启电脑了。


首先写出答案:会

但这里引出一个新的问题:加入调用者不是main函数怎么办?

试想一下你写了一个模块:包含malloc操作,载入于一个长时间运行的程序中(比如资料库)

你malloc了很多空间,也完成了目标操作,但模块不再被使用了以后,程序并没有退出,仍然处于运行状态。此时由于模块没有再被使用,指向那些内存的指针不见了,于是这些内存就不在能被访问了。但由于系统不会认为这些内存是无用的,所以也不会回收这些内存,那么内存泄露(memory leak)就出现了。

这就是为什么即使程序运行正确也一定要写上free或delete的原因

如果你认为写delete太麻烦,可以用以下的函数模板:(此处只给出delete数组的操作,有兴趣可以推理一下delete单个指针和new的操作)

template&
void SafeDeleteArray(T* t){
if(t){
delete[] t;
t = NULL;
}
}


C语言必须free,否则会发生内存泄露。确实有时候会出现malloc后不free也能运行,那是因为你的程序占用内存少,程序结束也就没关系了,但是注意那样风险很大,当你申请的内存太大会造成难以想像的问题,所以,建议养成写malloc就写free的习惯,这样比较安全。


应用程序会,驱动不会


进程结束以后会回收,但是应该养成free并让指针置NULL的好习惯


程序结束会收回,但是好些程序,例如系统程序,是会长时间运行的,如果不主动释放,会造成内存不足,程序崩坏


会自动释放,但这并不是一个良好的习惯,new一定要对应delete。没有delete/free的内存会一直存在到程序结束或被释放。只申请不释放最后可能就会MLE。


在C语言中写程序,有malloc,也必须有相应的free,C语言完全信任程序员,由程序员全权负责内存的动态分配和释放。每一个程序员都应当自觉承担起这个任务。无论在Windows平台还是Unix/Linux/BSD平台,如果只申请了内存而没有释放,那么在程序运行期间该内存就会一直被占用,在多任务环境下特别是长年运行的服务程序,这样的问题就非常严重了。

在Windows平台,如果程序没有自己释放已申请的内存就结束了,影响不大,Windows操作系统会自动回收给该程序的全部内存空间。但在Unix/Linux/BSD平台下,操作系统也没有办法回收这部分内存,在下次系统重新启动之前,这部分内存就是永远无法再使用了,术语是内存泄露。问题就会相当严重。


修改回答

c语言malloc之后最好使用free进行释放。具有回收功能的操作系统会回收你申请的资源。


推荐阅读:
相关文章