开发平台(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...