编辑:由于 coderredoc 建议的表述不佳,我正在关闭此问题。
我有一个自由函数的问题,我错误地将一个位置的地址作为参数。
void freeMemory(Stack stp, int n){
for(int i=0; i<n; i++){
free(&(stp.signals[n].intervals));
}
free(stp.signals);
}
这是正确的代码(查看下面了解更多信息)
void freeMemory(Stack stp, int n){
for(int i=0; i<n; i++){
free(stp.signals[n].intervals);
}
free(stp.signals);
}
永远记住一件事,你会传递给free
你分配使用的任何东西,malloc
它是朋友。
在这里,你已经通过了free(&(stp.signals[i].intervals));
,为什么你传递的地址,stp.signals[i].intervals
它的stp.signals[i].intervals
其中包含分配块的地址。(刚刚使用创建的内存块的起始地址*alloc
)所以free(stp.signals[i].intervals)
是释放它的正确方法。
准确地说,您在这里所做的是未定义的行为。
从标准7.22.3.3p2
free 函数导致 ptr 指向的空间被释放,即可供进一步分配。如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与之前由内存管理函数返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 释放,则行为未定义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句