1 #include 2 #include在 line 53中 使用free(current) ,這裡似乎是將current的記憶體釋放,然後實際上,這裡的釋放後,其記憶體資訊已經存在,3 #include 4 #include "
mainc26.h"5
struct
telphone;
10int
mainc26()
1137
if(head ==null)
38 printf("
**裡面沒有儲存任何資料:");
39else
40 puts("
通訊錄:");
41 current =head;
42while(current !=null)
4347 current =head;
48int n=0;49
while(current !=null)
5061
return0;
62 }
如果將line 54的current=null,注釋,該程式仍能正確執行,並通過該鍊錶將記憶體釋放掉,而實際上這種問題時錯誤的。
問題如下:
1view code**如下:
2 #include 3 #include 4
5struct
test 6;
10int
main()11;
13struct test *test1 = (struct test *)malloc(sizeof(struct
test));
14 test1->a=20
;15 test1->next = &test0;
16free
(test1);
17 printf("
%d %d
",test1->a,(*test1->next).a);
1819
}20 輸出test1->a為0 ,(*test1->next).a為10
2122 說明結構體裡的變數a已經被free釋放掉了,而test1的指標next卻還可以被訪問
解答如下
free函式,實際上做的事情不是真正的釋放記憶體。首先你要清楚,記憶體是由作業系統來管理的(操作包括分配、釋放等)。
系統中的內存在c語言分配記憶體機制上被分為很多個塊,c的底層**用資料結構chunk來表示。chunk中有乙個標誌位,用來表示該記憶體塊是否為待分配或者已分配狀態。每一次呼叫malloc,這個標誌位會被設定1(好像是1,記不太清楚了),呼叫free時被設定為0. 作業系統的記憶體管理機制會根據這個值來分配和釋放記憶體。
也就是說呼叫free的時候,只是設定了這個標誌位(當然還做了其他事,就你這個問題而言,只討論這個),而記憶體還原封不動的在那裡。所以,當你在系統真正釋放這個記憶體之前再次訪問這個位址,你會得到你想要的結果。
說明,「輸出test1->a為0」,這個的原因可能是free的時候,設定chunk塊的標誌位時,覆蓋了a的值。chunk資料結構中,第乙個位元組的前8位是標誌位,後面還有24位也有各自的用處。具體是什麼導致a的值為0的,你有興趣的話,你可以自己去研究。可以去閱讀linux的glibc原始碼。
"(*test1->next).a為10",就簡單了。next偏移struct test所佔記憶體的「頭(head)」距離較遠,free的時候的一些設定值的操作沒有影響到,能訪問到這個指標的值,並且test0還在函式棧中完整保留,自然就能訪問到了。
p.s c/c++的malloc/free和new/delete都有這個特性,所以程式設計的時候要養成乙個良好習慣,在呼叫free和delete的時候要將指標賦值為null,如:
free(ptr);
ptr=null;
或者delete ptr;
ptr=null;
所以這裡和回答的問題比較相符,實際上free(current)以後,其記憶體的實際內容 並沒有被釋放,仍然可以使用,但這樣是應該,
應該講記憶體釋放後的變數賦值為null.
那麼單項鍊表的記憶體該如何釋放呢??
可以參考如下的**,將其釋放
1view code//釋放記憶體
2struct telphone *temp;
3while(current !=null)
4
關於getopt long的疑惑
下面是乙個簡單的解析命令列引數的程式,但是如果把 static const char const shortopts ho v static const struct option longopts void formatprocname char argv,char procname,int si...
關於Struts MVC的疑惑
關於struts 的 web mvc,一直有個疑惑,請大家幫我理解一下.在struts中,m 應該指的什麼?在struts中,我一直理解為actionservlet作為 c action以及actionform 等作為 m jsp作 v 但看了spring的web mvc,引入了front cont...
關於free 的實際作用
list item 核心通過乙個紅黑樹來記錄了空閒的記憶體,malloc就是從樹中查詢一塊大小適合的記憶體並把位址給你,然後把這個節點從樹中摘除,避免被別人分配到產生衝突。這個記憶體現在歸你乙個人用了。free函式是把你的這個記憶體重新放回到紅黑樹中,讓別人可以申請到這個記憶體。從邏輯上來說,你現在...