[問題] free使用問題
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
XCode
問題(Question):
我正在練習寫動態記憶體配置
輸入的測資量若是超過現有的空間
就重新索取記憶體(第100行)
但是索取後正常來說應該要把舊資料free掉(107行)
不知為何free時出現錯誤
我嘗試過如果是在realloc前free資料的話是可以成功free的
可以請問各位前輩們這是什麼原因呢?
還是說free函數使用上有什麼使用限制嗎?
看了置頂13誡第六條我似乎也沒有違反,所以真的不知哪裡出問題了
「 但若不是用 malloc() 所得到的記憶體,則不可以 free()。已經 free()了
所指記憶體的指標,在它指向另一塊有效的動態分配得來的空間之前,不可
以再被 free(),也不可以提取(dereference)這個指標。
」
麻煩大家了,謝謝
錯誤結果(Wrong Output):
在第107行要free資料時,出現了錯誤,在XCode上提示為Thread 1:signal SIGABRT
程式碼(Code):(請善用置底文網頁, 記得排版)
https://ideone.com/VNDh2U
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.123.101.139
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1461484252.A.573.html
推
04/24 16:35, , 1F
04/24 16:35, 1F
→
04/24 16:37, , 2F
04/24 16:37, 2F
→
04/24 16:38, , 3F
04/24 16:38, 3F
→
04/24 16:39, , 4F
04/24 16:39, 4F
但是realloc的原理不是將該記憶體區塊的東西搬到其他地方再依照需求加大嗎?
並回傳加大後的指標
成功後沒free的話,原本record指向的記憶體內的東西不就一直存在?
還是其實我誤會了realloc的原理?
謝謝
※ 編輯: amenamen (140.123.101.139), 04/24/2016 17:17:57
→
04/24 17:29, , 5F
04/24 17:29, 5F
→
04/24 18:36, , 6F
04/24 18:36, 6F
→
04/24 18:37, , 7F
04/24 18:37, 7F
→
04/24 18:38, , 8F
04/24 18:38, 8F
→
04/24 18:39, , 9F
04/24 18:39, 9F
→
04/24 18:39, , 10F
04/24 18:39, 10F
→
04/24 18:39, , 11F
04/24 18:39, 11F
根據我測試的結果的確會複製過去(不知這樣的方法正不正確?)
另外我設一個指標a,用來確認舊資料會不會持續存在
結果發現他的內容的確還在...
※ 編輯: amenamen (49.215.49.242), 04/24/2016 18:58:28
推
04/24 19:06, , 12F
04/24 19:06, 12F
感謝提醒XD
→
04/24 19:08, , 13F
04/24 19:08, 13F
→
04/24 19:36, , 14F
04/24 19:36, 14F
→
04/24 19:36, , 15F
04/24 19:36, 15F
→
04/24 19:37, , 16F
04/24 19:37, 16F
→
04/24 19:37, , 17F
04/24 19:37, 17F
→
04/24 19:37, , 18F
04/24 19:37, 18F
推
04/24 19:42, , 19F
04/24 19:42, 19F
→
04/24 19:43, , 20F
04/24 19:43, 20F
→
04/24 19:43, , 21F
04/24 19:43, 21F
如果拿掉free(record);是可以正常執行沒錯,只是我是在想如果沒free掉
累積幾來的資料量似乎是很可觀的
→
04/24 19:47, , 22F
04/24 19:47, 22F
所以事實上資料已經被free掉,不過該記憶體區間還沒被其他資料覆蓋
是這樣解釋嗎?
推
04/24 19:57, , 23F
04/24 19:57, 23F
→
04/24 19:57, , 24F
04/24 19:57, 24F
→
04/24 19:58, , 25F
04/24 19:58, 25F
那我有個問題是
在我把temp指標給record之後,是不是也不需要free(temp),是這個意思嗎?
※ 編輯: amenamen (140.123.101.139), 04/24/2016 20:24:54
推
04/24 21:08, , 26F
04/24 21:08, 26F
但是此時的temp不是等於record嗎?
這樣不會把record free掉?
※ 編輯: amenamen (49.215.49.242), 04/24/2016 21:48:16
推
04/24 22:12, , 27F
04/24 22:12, 27F
→
04/24 22:12, , 28F
04/24 22:12, 28F