[英]C: pointer being freed was not allocated — when calling free
我的功能:
Shot *shot_collide(Shot *shot)
{
Shot *moving, *remaining;
remaining=NULL;
moving=shot;
while(moving!=NULL)
{
if(moving->y>658) //ha eléri az alját
{
if(remaining==NULL) //ha ez az első elem
{
shot=moving->next;
free(moving);
moving=shot->next;
}else{
remaining->next=moving->next;
free(moving);
moving=remaining->next;
}
}else{
moving=moving->next;
}
}
return shot;
}
当我打电话免费时,我在Xcode中收到此错误:
NHF(1670,0x7fff77e1a300)malloc: *对象0x10050c9e0的错误:指针释放>>未分配*在malloc_error_break中设置一个断点进行调试
这是一个SDL游戏,此功能在到达地图末端后即可释放。
我要到星期天才能完成,但是我被卡住了:(
你有个bug。
传递给free()
的值必须是malloc()
或相关函数之一返回的值。
我看到您正在修改moving
变量,但我认为我没有足够的上下文来告诉您确切需要更改的内容。
但是,您传递给free()
的值显然不是malloc()
返回的值。
编辑2
查看代码中的第110行和第113行(pastebin)。 创建移动,然后设置移动=射击,然后在第121行自由移动。在该转换块中,从未使用过malloc()
或calloc()
。 这就是为什么出现错误的原因。 不要在那个翻译块中释放它。 您可能需要在调用函数中释放内存(或在有内存的位置释放内存)。
编辑
如果在代码中创建了moving
,则更改了moving
使其指向的位置与原始返回的位置不同,则可能是由于不同的原因引起的。 参见插图:
char *string = {0};
string = calloc(10, 1);//see 1)
string++;//see 2)
free(string);//see 3)
1)字符串在内存中可能看起来像这样:
0x000BCA00
>|< (pointer position returned from calloc)
|0|0|0|0|0|0|0|0|0|0|
2)指针string
从其原始位置移动:
0x000BCA04
>|< (new ponter position)
|0|0|0|0|0|0|0|0|0|0|8|
3) 0x000BCA00!= 0x000BCA04,因此free()将不起作用
结束编辑
如果编译并运行:
int main(void)
{
char *p = malloc(10);
p++; //pointer is no longer what malloc returned, so free will not work
free(p);fails here
return 0;
}
您可能会收到您描述的错误消息。
我得到这个:
查看您的代码以找出类似的情况。 更好的是,遵循编译器错误消息的指示: 在malloc_error_break中设置一个断点以进行调试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.