C:释放的指针未被分配 - 在免费调用时

时间:2014-12-06 01:52:01

标签: 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ő 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游戏,此功能在到达地图末尾后即可自由拍摄。

我必须在星期天完成这个,但我被卡住了:(

2 个答案:

答案 0 :(得分:0)

你有一个错误。

您传递给free()的值必须是malloc()或其中一个相关函数返回的值。

我发现您正在修改moving变量,但我认为我没有足够的背景来告诉您确切需要更改的内容。

但您传递给free()的值显然不是malloc()返回的值。

答案 1 :(得分:0)

编辑2

查看代码中的第110行和第113行(pastebin)。您创建移动,然后设置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|  

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;
}  

您可能会收到您所描述的错误消息 我得到了这个:

enter image description here

查看代码 以确定类似的条件。更好的是,请按照编译器错误消息的说明进行操作: 在malloc_error_break中设置断点以进行调试