[讨论] 大家对C语言中 free() 的看法?

楼主: Hazukashiine (私は幸せです)   2015-06-14 14:40:16
许多教程式的教授或是工程师会认为一个好的程式中 free() 与 *alloc() 必须成对。
通常执行 free() 并不会把 memory 还给 operating system,
反而是告诉程式,下一次 *alloc() 的时候,可以用一下之前 free() 过的空间。
这种设计并不坏,主要是为了节省 system call 的时间消耗。
虽然心中觉得成对会比较严谨一点,不过在实作的时候确实会容易造成问题。
问题一:
前一个人 free() 掉之后,并没有把指标设成 NULL,然后还在 code 中到处流串,
只要一不小心,*** glibc detected *** double free or corruption 就会死给你看,
这种 bug 最恶心了,尤其在其他 code 不是你写的时候。
问题二:
当一个函数的回传值是一个指向空间的指标的时候,
而且这个函数会将这个指标送给超过一个的函数的话,
只要其中一个函数 free() 掉之后,其他的函数也会跟着遭殃,
通常会送个 Segmentation fault (core dumped) 当作圣诞节礼物。
程式在结束的时候,大部分的作业系统都会回收内存,
所以,若在程式码结尾的地方 free() 掉所有申请过的空间,也是多此一举。
我的看法是,若该指标出现在循环中或是递回中的话,才有使用 free() 的必要,
其余的指标就让作业系统去回收吧,毕竟通常吃内存的怪兽都是循环或递回中的指标。
大家怎么看?通常都会严格遵守成对的习惯吗?
作者: LiloHuang (十年一刻)   2015-06-14 14:46:00
还好我写 C++ 我用 smart pointer (boost::shared_ptr)倒是看过不少人会定义一个 SAFE_FREE macro 来设 NULL至于 free 会不会真的还给作业系统要看 C-Runtime 实作glibc 可以用 malloc_stats() 来看有没有还回去至于 MSVCRT 的话,我没记错 free 每次都还回去就是 :)
作者: chchwy (mat)   2015-06-14 14:57:00
你当内存用不完阿 不还很快就没了
作者: azureblaze (AzureBlaze)   2015-06-14 15:09:00
不free你也只是把问题晾在那边没解决啊
作者: kevingwn (如云如风的人生)   2015-06-14 15:09:00
问题1&2的症结都在于:不要free()不是你*alloc()出来的指标,例如某DLL是用gcc编译,你在MSVC的程式去free()它的指标会有不可预期的结果问题3:遵守成对是写C的基本,对此有疑虑建议改用有垃圾回收机制的语言
作者: uranusjr (←這人是超級笨蛋)   2015-06-14 15:12:00
两个问题都是因为没有正确让它们成对, 成对本身没有问题
作者: bibo9901 (function(){})()   2015-06-14 15:40:00
推楼上
作者: Qbsuran (Qbsuran)   2015-06-14 15:59:00
照这样想法如果去写infinity loop 很快就会挂掉 不是所有程式都要结束
作者: suhorng ( )   2015-06-14 16:23:00
可是循环很多耶, 像是跑不停的服务器程式不能一直不 free 下去呀一次性跑一下就没了的程式就算了
作者: azureblaze (AzureBlaze)   2015-06-14 16:33:00
要求使用着自己弄一块内存给你写或是用alloc_str() free_str()给使用者就像fopen和fclose也得成对这是一定得处理的问题,等程式结束绝对不是解决方案
作者: kevingwn (如云如风的人生)   2015-06-14 17:38:00
这种情况free()的责任在Mr.A而不在B,通常A要提供另一个函式给B,B应该呼叫该函式让A有机会free(),而不是直接使用free() 因为A&B可能经不同的编译后才连结两者的malloc及free来自不同的c runtime,混用将造成不可预期的结果若一起编译的话当然没问题,但结果是A&B这对CP不可拆不可逆XD不是良好的设计
作者: ah7675 (阿毛)   2015-06-14 23:35:00
你是不是没修过作业系统@@?
作者: Killercat (杀人猫™)   2015-06-15 18:26:00
现代OS多半都能回收,但是这并没有保证我个人会建议记得的话还是写一下
作者: cobrasgo (人鱼线变成鲔鱼线,超帅)   2015-06-16 18:30:00
c不只用在pc上,在mcu上这样搞就死定了
作者: Killercat (杀人猫™)   2015-06-17 17:56:00
应该说 在非保护模式的OS上 一定死 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com