[問題] free使用問題

看板C_and_CPP作者 (張)時間8年前 (2016/04/24 15:50), 8年前編輯推噓6(6022)
留言28則, 3人參與, 最新討論串1/1
開發平台(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
舊資料不是free掉,用ZeroMemory
04/24 16:35, 1F

04/24 16:37, , 2F
realloc後馬上free掉,不就做白工了XD
04/24 16:37, 2F

04/24 16:38, , 3F
record在 realloc 成功後就不能使用了
04/24 16:38, 3F

04/24 16:39, , 4F
反而是你realloc失敗後應該要 free(record)
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
拙弟認為realloc沒有複制記憶體的功能
04/24 17:29, 5F

04/24 18:36, , 6F
如果我對C11 standard的理解沒錯,如果realloc比較大的
04/24 18:36, 6F

04/24 18:37, , 7F
空間,那realloc之前的內容應該會被複製過去
04/24 18:37, 7F

04/24 18:38, , 8F
Ref: C11 standard P367, 7.22.3.5-2
04/24 18:38, 8F

04/24 18:39, , 9F
The contents of the new object shall be the same as
04/24 18:39, 9F

04/24 18:39, , 10F
that of the old object prior to deallocation, up to
04/24 18:39, 10F

04/24 18:39, , 11F
the lesser of the new and old sizes.
04/24 18:39, 11F
http://i.imgur.com/2FoobBJ.png
根據我測試的結果的確會複製過去(不知這樣的方法正不正確?) 另外我設一個指標a,用來確認舊資料會不會持續存在 結果發現他的內容的確還在... ※ 編輯: amenamen (49.215.49.242), 04/24/2016 18:58:28

04/24 19:06, , 12F
順便提醒,gets不是安全的函式,輸入太多會爆掉 XD
04/24 19:06, 12F
感謝提醒XD

04/24 19:08, , 13F
realloc失敗的情況,該指標指向的東西不會變
04/24 19:08, 13F

04/24 19:36, , 14F
The realloc function deallocates the old object
04/24 19:36, 14F

04/24 19:36, , 15F
pointed to by ptr and returns a pointer to a new
04/24 19:36, 15F

04/24 19:37, , 16F
object that has the size specified by size
04/24 19:37, 16F

04/24 19:37, , 17F
我從 C99 上查到的 realloc 的定義,所以
04/24 19:37, 17F

04/24 19:37, , 18F
我認為舊ptr 應該會被 free掉
04/24 19:37, 18F

04/24 19:42, , 19F
C11同上,可能舊ptr被realloc free掉但並沒有做=NULL
04/24 19:42, 19F

04/24 19:43, , 20F
所以再free一次就會出現error
04/24 19:43, 20F

04/24 19:43, , 21F
要不要試試看把free(record);拿掉?
04/24 19:43, 21F
如果拿掉free(record);是可以正常執行沒錯,只是我是在想如果沒free掉 累積幾來的資料量似乎是很可觀的

04/24 19:47, , 22F
另外提一下,資料還在記憶體中不代表那塊你可以用
04/24 19:47, 22F
所以事實上資料已經被free掉,不過該記憶體區間還沒被其他資料覆蓋 是這樣解釋嗎?

04/24 19:57, , 23F
而且有可能realloc前後pointer的位置並沒有變
04/24 19:57, 23F

04/24 19:57, , 24F
只是size變大了,所以你free(record) = free(temp)
04/24 19:57, 24F

04/24 19:58, , 25F
然後你後面的copy就會因為free掉失敗了
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
程式跑完前還是要free(temp)阿
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
抱歉誤會你意思了,如果temp=record,那你free record就
04/24 22:12, 27F

04/24 22:12, , 28F
等於free temp...
04/24 22:12, 28F
文章代碼(AID): #1N77hSLp (C_and_CPP)