[問題] free使用問題

作者: amenamen (張)   2016-04-24 15:50:44
開發平台(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
作者: stupid0319 (徵女友)   2016-04-24 16:35:00
舊資料不是free掉,用ZeroMemoryrealloc後馬上free掉,不就做白工了XD
作者: withoutshine (何必幫別人想那麼多)   2016-04-24 16:38:00
record在 realloc 成功後就不能使用了反而是你realloc失敗後應該要 free(record)
作者: stupid0319 (徵女友)   2016-04-24 17:29:00
拙弟認為realloc沒有複制記憶體的功能
作者: wtchen (沒有存在感的人)   2016-04-24 18:36:00
如果我對C11 standard的理解沒錯,如果realloc比較大的空間,那realloc之前的內容應該會被複製過去Ref: C11 standard P367, 7.22.3.5-2The contents of the new object shall be the same asthat of the old object prior to deallocation, up tothe lesser of the new and old sizes.順便提醒,gets不是安全的函式,輸入太多會爆掉 XDrealloc失敗的情況,該指標指向的東西不會變
作者: withoutshine (何必幫別人想那麼多)   2016-04-24 19:36:00
The realloc function deallocates the old objectpointed to by ptr and returns a pointer to a newobject that has the size specified by size我從 C99 上查到的 realloc 的定義,所以我認為舊ptr 應該會被 free掉
作者: wtchen (沒有存在感的人)   2016-04-24 19:42:00
C11同上,可能舊ptr被realloc free掉但並沒有做=NULL所以再free一次就會出現error要不要試試看把free(record);拿掉?
作者: withoutshine (何必幫別人想那麼多)   2016-04-24 19:47:00
另外提一下,資料還在記憶體中不代表那塊你可以用
作者: wtchen (沒有存在感的人)   2016-04-24 19:57:00
而且有可能realloc前後pointer的位置並沒有變只是size變大了,所以你free(record) = free(temp)然後你後面的copy就會因為free掉失敗了程式跑完前還是要free(temp)阿抱歉誤會你意思了,如果temp=record,那你free record就等於free temp...

Links booklink

Contact Us: admin [ a t ] ucptt.com