關於free的使用疑惑

2022-08-04 20:03:14 字數 2255 閱讀 3170

1 #include 2 #include 

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 53中 使用free(current) ,這裡似乎是將current的記憶體釋放,然後實際上,這裡的釋放後,其記憶體資訊已經存在,

如果將line 54的current=null,注釋,該程式仍能正確執行,並通過該鍊錶將記憶體釋放掉,而實際上這種問題時錯誤的。

問題如下:

1

**如下:

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卻還可以被訪問

view code

解答如下

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.

那麼單項鍊表的記憶體該如何釋放呢??

可以參考如下的**,將其釋放

1

//釋放記憶體

2struct telphone *temp;

3while(current !=null)

4

view code

關於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函式是把你的這個記憶體重新放回到紅黑樹中,讓別人可以申請到這個記憶體。從邏輯上來說,你現在...