楼主:
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 大概指的是每一个独立的程式档
我认为除非你还要重复使用那个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消失之前你都不会再用他 那就不需要加了
已经退租的房子,有没有把契约打叉的差别?XD你的想法比较谨慎,也没有错,但额外开销是否值得呢?开销包括相对冗长的程式,以及执行所花费的时间
作者:
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)
作者:
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:00life 是local的话不用null,但多加一行也耗不了多少CPU
作者:
OPIV (Monitor)
2015-05-29 22:04:00lin 大 do while 可以拿掉吧
作者:
bibo9901 (function(){})()
2015-05-29 22:37:00用 do-while 是为了可以在 SAFE_FREE(PTR) 之后加上分号
if(foo) SAFE_FREE(bar); 这样没do-while会坏掉do while false是macro的一种保险
哈当初也是疑惑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) 这个.