Re: [問題] free 與 pointer 的問題
※ 引述《way111078 (wei)》之銘言:
: int *addLines;
: addLines = realloc(addLines, (pointCount)*sizeof(int));
如 love 大所說,上面這行會爆,
int *addLines = NULL; 再調用好些。
: *(addLines + (pointCount-1)) = currentPoint;
: 請問大大free的時候
: 1.只要寫free(addLines);就好了嗎?
: 2.addLines指在被realloc記憶體的區塊哪一個位址都可以被free嗎?
這裡要說明 realloc 實際動作,
int *a = NULL, *b=NULL;
a = (int*)malloc(sizeof(int)*10);
b = (int*)realloc(a, sizeof(int)*20); // ---> 注意這行
free(b);
實際上第三行只是把 a 重新 resize 成 20,前面 10 個 size 的值會保留,
重點是在於 "resize" 這個動作,
會先去看 a 的位置夠不夠 resize 成 20 個 size,
如果可以的話就在原本的位置 resize,
如果不行的話會再找其它可以放 20 個 int 的位置,再把 a 的 10 個 int 搬過去,
接著自動釋放舊的空間。然而,上面即使 b 對 a 進行 realloc,事實上
a 和 b 是對同一塊 memory 做管理。
所以下面這段寫法是危險的
int *a=NULL;
a = (int*)malloc(sizeof(int)*10);
(int*)realloc(a, sizeof(int)*20); // ---> 如果是換到新的位置去的話就爆了
第三行便要改成
a = (int*)realloc(a, sizeof(int)*20);
至於您說 free 的問題,我想了解以上各點之後,你就沒這方面問題了,
不論是
b = (int*)realloc(a, sizeof(int)*20); // (1)
或是
a = (int*)realloc(a, sizeof(int)*20); // (2)
在第一段 (1) (b=...realloc(a,...)) 中,事實上所管理的都是同一段記憶體,
但這裡要注意,如果 a 空間不夠, b 會另外找新的空間,所以你應該是要
free(b),而不是 free(a)。如果是程式 realloc 到新的空間而你又 free(a)
這時候才會爆,這個錯不容易抓出來。
(簡單的說,如果 realloc 到新空間, realloc 時就已經把 a free 掉、
搬到 b 去了,這時也只能對 b 做釋放;如果是 realloc 到原空間,
那對 a 還是對 b 做 free 都是可以的。避免這種困擾,還是統一 free b)
至於第二段 (2) 就不用說了,只能 free(a)
另外再提醒,不論是 malloc 或是 realloc,失敗都是傳回 NULL,
這時便不可進行釋放。
上面的述敘中,我想你也注意到了,用 realloc 時會 "參考舊的位置",
這是您這段碼要注意的地方。
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.142
※ 編輯: tropical72 來自: 180.177.76.142 (01/19 01:40)
推
01/19 01:42, , 1F
01/19 01:42, 1F
→
01/19 01:43, , 2F
01/19 01:43, 2F
推
01/19 01:43, , 3F
01/19 01:43, 3F
→
01/19 01:44, , 4F
01/19 01:44, 4F
→
01/19 01:46, , 5F
01/19 01:46, 5F
→
01/19 01:52, , 6F
01/19 01:52, 6F
推
01/19 01:52, , 7F
01/19 01:52, 7F
→
01/19 01:52, , 8F
01/19 01:52, 8F
※ 編輯: tropical72 來自: 180.177.76.142 (01/19 02:01)
→
01/19 01:55, , 9F
01/19 01:55, 9F
推
01/19 01:56, , 10F
01/19 01:56, 10F
→
01/19 01:57, , 11F
01/19 01:57, 11F
→
01/19 01:58, , 12F
01/19 01:58, 12F
→
01/19 01:58, , 13F
01/19 01:58, 13F
→
01/19 01:59, , 14F
01/19 01:59, 14F
→
01/19 01:59, , 15F
01/19 01:59, 15F
→
01/19 02:00, , 16F
01/19 02:00, 16F
→
01/19 02:00, , 17F
01/19 02:00, 17F
→
01/19 02:03, , 18F
01/19 02:03, 18F
推
01/19 02:10, , 19F
01/19 02:10, 19F
→
01/19 02:11, , 20F
01/19 02:11, 20F
→
01/19 02:11, , 21F
01/19 02:11, 21F
推
01/19 02:16, , 22F
01/19 02:16, 22F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):