開發平台(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
舊資料不是free掉,用ZeroMemoryrealloc後馬上free掉,不就做白工了XD
record在 realloc 成功後就不能使用了反而是你realloc失敗後應該要 free(record)
作者:
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失敗的情況,該指標指向的東西不會變
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:00C11同上,可能舊ptr被realloc free掉但並沒有做=NULL所以再free一次就會出現error要不要試試看把free(record);拿掉?
作者:
wtchen (沒有存在感的人)
2016-04-24 19:57:00而且有可能realloc前後pointer的位置並沒有變只是size變大了,所以你free(record) = free(temp)然後你後面的copy就會因為free掉失敗了程式跑完前還是要free(temp)阿抱歉誤會你意思了,如果temp=record,那你free record就等於free temp...