[问题] 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