[問題] mem_alloc及mem_free的對應問題

看板C_and_CPP (C/C++)作者 (paris)時間16年前 (2009/12/30 19:26), 編輯推噓5(5020)
留言25則, 5人參與, 最新討論串1/1
#include<stdlib.h> #include<stdio.h> /* 要注意mem_alloc及mem_free的對應,要用方法發現或防止忘了mem free。 */ void mem_free(int *); int main(void) { int *ptr; ptr=(int *)malloc(sizeof(int)); *ptr=1000; printf("%d\n",*ptr); mem_free(ptr); *ptr=5; printf("%d\n",*ptr); system("pause"); return 0; } void mem_free(int *ptr1) { if(ptr1!=NULL) { free(ptr1); ptr1=NULL; } //*ptr1=5; } 此程式出來的答案是 1000 5 但是有疑問的就是在主程式的mem_free(ptr);下面 明明已經把mem_free了 為何可以使用*ptr=5 設值 但若是在mem_free(int *ptr1) function中的最後 若是設成*ptr1=5 卻會interrupt ? 這是什麼原因呢??? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.9.4.125

12/30 19:33, , 1F
mem_free裡把ptr1設為NULL 並不影響ptr 去dereference一個
12/30 19:33, 1F

12/30 19:33, , 2F
一個NULL pointer會出錯 但是ptr並不是NULL pointer(即使
12/30 19:33, 2F

12/30 19:34, , 3F
在mem_free執行完之後)
12/30 19:34, 3F

12/30 22:34, , 4F
承接樓上, 在mem_free後的*ptr1=5會馬上出錯, 是因為你
12/30 22:34, 4F

12/30 22:35, , 5F
企圖對NULL寫值; main裡在mem_free不會出錯, 1是因為在
12/30 22:35, 5F

12/30 22:35, , 6F
mem_free()裡給的NULL並不影響到main裡的ptr, 只是mem
12/30 22:35, 6F

12/30 22:36, , 7F
manager已經記錄了該記憶體已被還掉, 只要該位址尚未做
12/30 22:36, 7F

12/30 22:37, , 8F
其他用途, *ptr=5; 暫時有可能不會出錯, 但是對一塊不屬
12/30 22:37, 8F

12/30 22:37, , 9F
於你可以合法使用的記憶體做讀寫, 都是不應該的:)
12/30 22:37, 9F

12/30 23:14, , 10F
那free(ptr1)時,為什麼不會把ptr所指向的空間釋放???
12/30 23:14, 10F

12/30 23:14, , 11F
我不太懂free(ptr1)釋放那一塊空間?
12/30 23:14, 11F

12/30 23:15, , 12F
void mem_free(int *ptr1)會建立*ptr1指標,指向ptr所指空
12/30 23:15, 12F

12/30 23:15, , 13F
間不是嗎? >"< 我越來越迷網了XD
12/30 23:15, 13F

12/30 23:27, , 14F
你可以在main裡加mem_free前後加printf("%d\n",ptr);
12/30 23:27, 14F

12/30 23:27, , 15F
就會知道大概發生什麼事了
12/30 23:27, 15F

12/30 23:39, , 16F
不是%p嗎? 我看過都一樣=.=
12/30 23:39, 16F

12/31 00:18, , 17F
malloc回來的空間有沒有被釋放, 跟指標是否重設成NULL是
12/31 00:18, 17F

12/31 00:19, , 18F
兩件不同的事, malloc回來賦值的指標直接重設成NULL, 這
12/31 00:19, 18F

12/31 00:19, , 19F
個空間也不會被free; 你free(ptr)了malloc來的空間, ptr
12/31 00:19, 19F

12/31 00:20, , 20F
也不會自動變成NULL; 唯一相關的是, 你如果沒把ptr存好
12/31 00:20, 20F

12/31 00:20, , 21F
就在free前又重給值, 就會有memory leak的問題發生.
12/31 00:20, 21F

12/31 00:21, , 22F
至於印出ptr值都一樣, 其實是pass by value或者pass by
12/31 00:21, 22F

12/31 00:22, , 23F
reference的問題; 請試想寫一個func由caller傳入callee
12/31 00:22, 23F

12/31 00:22, , 24F
兩數使其能夠在caller看到交換的結果, 大概就是這樣:)
12/31 00:22, 24F

12/31 01:22, , 25F
請記得在主程式 int *ptr = NULL 要加初值~
12/31 01:22, 25F
文章代碼(AID): #1BEpZd20 (C_and_CPP)
文章代碼(AID): #1BEpZd20 (C_and_CPP)