C:调用free时,未分配被释放的指针
我的职能:C:调用free时,未分配被释放的指针,c,C,我的职能: 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ő el
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;
}
当我调用free时,我在Xcode中遇到以下错误:
NHF1670,0x7fff77e1a300 malloc:*对象0x10050c9e0的错误:释放的指针>未分配
*在malloc\u error\u break中设置断点以进行调试
这是一个SDL游戏,这个功能是免费的拍摄后,它到达地图的结尾
我必须在星期天完成这项工作,但我被卡住了:你有个bug
传递给free的值必须是malloc返回的值或相关函数之一
我看到您正在修改移动变量,但我认为我没有足够的上下文来确切地告诉您需要更改什么
但是传递给free的值显然不是malloc返回的值。EDIT 2
查看代码中的第110行和第113行。创建移动,然后设置moving=shot,然后在第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|
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中设置一个断点以进行调试在创建指针和尝试释放指针之间移动指针。您没有显示足够的代码来允许编译和运行测试,因此很难确定。但是如果你做了类似于char*p=malloc10;,的事情;,然后p++;,然后弗里普;您可能会得到您描述的错误。您在粘贴箱中的哪一行得到您描述的错误?正在释放的指针>未分配*在malloc\u error\u break中设置一个断点以调试是否遵循了消息指令?121。第一个功能是免费的,我试着在问题中写下了。我明白了:我下面的回答并没有完全解决您的具体问题。我想我把真正的问题说错了。您真正的问题是,在translation unit函数中,您看到了错误消息,创建了moving,分配了一个值,然后尝试释放,而没有调用calloc或malloc来分配内存。我想这就是你发出错误信息的原因。很抱歉之前的混乱。你告诉我,你没有足够的上下文,所以我给你发送了一个更大的上下文,所以我希望你能找到小错误,我的调试程序和我在2小时内找不到的。这不是我的全部代码。我告诉过你的是stackoverflow是一个完整的问题。对不起,我有付费客户,我不能从工作中抽出时间来调试你的程序。我认为调试这个问题并不难。我告诉过你是什么引起的。你需要看看在哪里发生的。我想我的链接列表中有些错误。我的调试程序什么也没告诉我,所以我在搜索它。无论如何谢谢你@fzsombor-查看代码中的第110行和第113行。创建移动,然后设置moving=shot,然后在第121行上自由移动。在该转换块中,您从未对其使用malloc或calloc。这就是为什么你会犯错误。不要释放它。您可能需要在调用函数中释放快照,或者在任何有内存的地方释放快照。如果您复制变量中的指针,并将该变量释放,它不需要释放它指向的内存吗?您只在使用malloc、calloc或realloc最初分配内存的指针变量上使用free。所以,答案是否定的,不要在那个块中自由移动:。我需要在它碰撞时释放它。所以我不能在调用alloc的地方释放它,因为这个函数只是创建快照。
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;
}