作者fcouple (人生啊…)
看板C_and_CPP
標題[問題] free 指令一問
時間Wed Feb 9 23:32:32 2011
各位版友,新年快樂,小弟有個問題想請教:
底下先說說我對 free() 的認知,若有誤請前輩指正:
書上告訴我們 free() 可以把配置的記憶體收回,
給我們系統自動幫我們把指標也一併做後續處理的錯覺。
但我爬文的結果卻是 free() 只是告訴系統該記憶體不使用。
只有「告訴」系統而已,我測試:
free( ptr );
printf("%d", ptr->someone); //someone 是一個int
free後,甚至還是可以印出它的值。
所以我們在free後還要自己擦屁股:
free( ptr );
ptr = NULL;
設定成 NULL 這裡我不確定,有誤請指正。
以上是我對 free() 的認知,底下是要問的問題:
#include <stdio.h>
#include <stdlib.h>
typedef struct myst {
int x;
long y;
unsigned char *arry;
} myst;
void delst(myst *ast)
{
free( ast->arry );
ast->arry = NULL;
printf("delst 之前 %p\n", ast);
free( ast );
ast = NULL;
printf("delst 之後 %p\n", ast);
}
int main()
{
printf("%d\n", sizeof(myst));
myst *ast = (myst *)malloc( sizeof(myst) );
ast->arry = (unsigned char *)malloc( sizeof(unsigned char)*5 );
printf("main 之前 %p\n", ast);
delst( ast );
printf("main 之後 %p\n", ast);
printf("執行 delst 之後 arry 的內容 %p\n", ast->arry);
return 0;
}
註:printf是在debug所以我往前縮一。
我的用意,是要用一個 delst() 來處理 free 的種種細項動作,讓程式簡潔。
但執行結果卻不如預期(底下是上面程式的執行結果):
12
main 之前 003E4848
delst 之前 003E4848
delst 之後 00000000
main 之後 003E4848 <-- 我覺得它有問題,不是應該要 00000000 才對嗎?
執行 delst 之後 arry 的內容 00000000
我要問的是,為何
「main 之後 003E4848」
而不是
「main 之後 00000000」
,換句話說就是呼叫副程式幫我 free 了以後,回到了 main 中怎麼記憶體位址
又回來了? 不是應該要是 NULL 才對嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.76.74.145
推 nowar100:還回去不代表你碰不到 你操作他是未定義行為 02/09 23:36
→ nowar100:設成NULL只是為了避免兩次free 02/09 23:36
→ nowar100:free裡面大概長這樣 if (p!=NULL) ...; 02/09 23:37
→ stupid0319:你NULL的是STACK的值唷XD 02/09 23:39
→ james732:free的意思有點類似租房子跟房東解約 02/09 23:47
→ james732:解約後你當然還是知道房子在哪 想要偷偷住也是做得到 02/09 23:48
→ james732:至於房東會不會生氣就是另外一回事了...XDDD 02/09 23:49
→ james732:不知道為什麼 \n 會自己變成 n... 02/10 00:02
推 tropical72:樓上比喻真是太妙了 02/10 00:25
推 Neo1978:james732 正解。 main 的 ast 跟 delst 的 ast 不是同一個 02/10 01:43
→ uranusjr:租房子的比喻很棒XD 02/10 13:39
→ loveme00835:疑? 我怎麼記得這個比喻之前有出現過 @_@ 02/10 13:46
→ james732:真的嗎?這個比喻是我昨天心血來潮想到的 XDDD 02/10 14:22
→ loveme00835:我記得之前這比喻也是你想的...XD 02/10 14:55
→ james732:我老了嗎 完全不記得這回事 XDDDD 02/10 15:33
推 VictorTom:j大莫非美國牛肉吃多了XD 02/11 00:11