[问题] free 之后

楼主: kroll (BigBang)   2015-05-29 11:24:37
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
BIOS, UEFI. GCC or VC
C + 组语
问题(Question):
今天跟前辈聊到 allcate 之后的free
ex:
*VOID
Function A {
pointer = allocate ;
...
if (Status != Success) {
free (pointer)
return NULL;
}
return pointer;
}
Function B {
ptr = Function A ();
if (ptr == NULL) return;
}
我的观念是认为虽然做了free, 但是内存中的内容 pointer位址还是指向某个地方
所以会有风险, 做NULL是有必要的 (pointer = NULL).
前辈认为, 如果是local function, 在free之后去做 pointer = NULL 是不需要的code
分歧点大概就是他认为毫无风险
我本身是数学系背景, 也没什么经验举例去说服前辈
想请教诸位, 真的如前辈所说, function/driver 过了就没事了吗?
补充说明(Supplement):
举例内容不是UEFI语法, 只是大概的意思
UEFI BIOS的driver 大概指的是每一个独立的程式档
作者: ahwater01 (臭酸咖)   2015-05-29 11:28:00
我认为除非你还要重复使用那个pointer,不然free过后还指回null,是没意义又降低perfomance
作者: qsort (Cos)   2015-05-29 12:34:00
楼上+1, pointer有reuse需求, 才需要在free的时候设成NULL
作者: overhead (overhead)   2015-05-29 12:37:00
你前辈是对的 真的没问题虽然该pointer指向某个地方 但是在他离开function消失之前你都不会再用他 那就不需要加了
作者: james732 (好人超)   2015-05-29 12:43:00
已经退租的房子,有没有把契约打叉的差别?XD你的想法比较谨慎,也没有错,但额外开销是否值得呢?开销包括相对冗长的程式,以及执行所花费的时间
作者: azureblaze (AzureBlaze)   2015-05-29 12:50:00
这种通常会被optimize掉吧?
作者: kdjf (我抓得到什么呢?)   2015-05-29 12:51:00
其实最佳化开下去,编译器看到后面没用到说不定直接丢了y
楼主: kroll (BigBang)   2015-05-29 13:02:00
恩, 我是因为吃过野指标的亏, 所以把 NULL 当作default在做所以这次刚好讨论到, 想说还是把情况弄清楚比较好额外一提, BIOS很多时候是不做编译最佳化的多谢各位先进指教
作者: linotwo (._.)   2015-05-29 14:22:00
因为这种情况就算有 asign NULL 通常也会被最佳化掉可以用一个宏把 free 跟 asign NULL 包装起来好处是当指标的 scope 改变时可以减少非预期行为的机会#define SAFE_FREE(PTR) do{free(PTR);PTR=0;}while(0)
作者: TobyH4cker (Toby (我要当好人))   2015-05-29 14:33:00
Delphi有个FreeAndNil() 题外
作者: EdisonX (卡卡兽)   2015-05-29 20:51:00
通常指回 NULL 的情况是这个指标会重复使用, 如if(ptr==null) {ptr = new TYPE[] ;}if(ptr!=NULL) { delete ptr ; ptr = NULL ;}
作者: askacis (ASKA)   2015-05-29 21:09:00
life 是local的话不用null,但多加一行也耗不了多少CPU
作者: OPIV (Monitor)   2015-05-29 22:04:00
lin 大 do while 可以拿掉吧
作者: bibo9901 (function(){})()   2015-05-29 22:37:00
用 do-while 是为了可以在 SAFE_FREE(PTR) 之后加上分号
作者: azureblaze (AzureBlaze)   2015-05-29 22:43:00
if(foo) SAFE_FREE(bar); 这样没do-while会坏掉do while false是macro的一种保险
作者: KoenigseggG (地表最速)   2015-05-29 23:17:00
哈当初也是疑惑do while这个,不过google就有了@@
作者: uranusjr (←這人是超級笨蛋)   2015-05-29 23:18:00
这是 coding style,团队讲好比较重要 (才知道如何维护)
作者: ctrlbreak   2015-05-31 09:20:00
其实delete会检查ptr是否为null, 所以也不用写if(ptr!=NULL) 这个.

Links booklink

Contact Us: admin [ a t ] ucptt.com