看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
stupid0319: 舊資料不是free掉,用ZeroMemory 04/24 16:35
stupid0319: realloc後馬上free掉,不就做白工了XD 04/24 16:37
withoutshine: record在 realloc 成功後就不能使用了 04/24 16:38
withoutshine: 反而是你realloc失敗後應該要 free(record) 04/24 16:39
但是realloc的原理不是將該記憶體區塊的東西搬到其他地方再依照需求加大嗎? 並回傳加大後的指標 成功後沒free的話,原本record指向的記憶體內的東西不就一直存在? 還是其實我誤會了realloc的原理? 謝謝 ※ 編輯: amenamen (140.123.101.139), 04/24/2016 17:17:57
stupid0319: 拙弟認為realloc沒有複制記憶體的功能 04/24 17:29
wtchen: 如果我對C11 standard的理解沒錯,如果realloc比較大的 04/24 18:36
wtchen: 空間,那realloc之前的內容應該會被複製過去 04/24 18:37
wtchen: Ref: C11 standard P367, 7.22.3.5-2 04/24 18:38
wtchen: The contents of the new object shall be the same as 04/24 18:39
wtchen: that of the old object prior to deallocation, up to 04/24 18:39
wtchen: the lesser of the new and old sizes. 04/24 18:39
http://i.imgur.com/2FoobBJ.png 根據我測試的結果的確會複製過去(不知這樣的方法正不正確?) 另外我設一個指標a,用來確認舊資料會不會持續存在 結果發現他的內容的確還在... ※ 編輯: amenamen (49.215.49.242), 04/24/2016 18:58:28
wtchen: 順便提醒,gets不是安全的函式,輸入太多會爆掉 XD 04/24 19:06
感謝提醒XD
wtchen: realloc失敗的情況,該指標指向的東西不會變 04/24 19:08
withoutshine: The realloc function deallocates the old object 04/24 19:36
withoutshine: pointed to by ptr and returns a pointer to a new 04/24 19:36
withoutshine: object that has the size specified by size 04/24 19:37
withoutshine: 我從 C99 上查到的 realloc 的定義,所以 04/24 19:37
withoutshine: 我認為舊ptr 應該會被 free掉 04/24 19:37
wtchen: C11同上,可能舊ptr被realloc free掉但並沒有做=NULL 04/24 19:42
wtchen: 所以再free一次就會出現error 04/24 19:43
wtchen: 要不要試試看把free(record);拿掉? 04/24 19:43
如果拿掉free(record);是可以正常執行沒錯,只是我是在想如果沒free掉 累積幾來的資料量似乎是很可觀的
withoutshine: 另外提一下,資料還在記憶體中不代表那塊你可以用 04/24 19:47
所以事實上資料已經被free掉,不過該記憶體區間還沒被其他資料覆蓋 是這樣解釋嗎?
wtchen: 而且有可能realloc前後pointer的位置並沒有變 04/24 19:57
wtchen: 只是size變大了,所以你free(record) = free(temp) 04/24 19:57
wtchen: 然後你後面的copy就會因為free掉失敗了 04/24 19:58
那我有個問題是 在我把temp指標給record之後,是不是也不需要free(temp),是這個意思嗎? ※ 編輯: amenamen (140.123.101.139), 04/24/2016 20:24:54
wtchen: 程式跑完前還是要free(temp)阿 04/24 21:08
但是此時的temp不是等於record嗎? 這樣不會把record free掉? ※ 編輯: amenamen (49.215.49.242), 04/24/2016 21:48:16
wtchen: 抱歉誤會你意思了,如果temp=record,那你free record就 04/24 22:12
wtchen: 等於free temp... 04/24 22:12