Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Valgrind在尝试释放malloc';ed结构_C_Memory_Valgrind - Fatal编程技术网

Valgrind在尝试释放malloc';ed结构

Valgrind在尝试释放malloc';ed结构,c,memory,valgrind,C,Memory,Valgrind,Valgrind总是唠叨,当以前的malloc'ed结构可用时,会出现内存错误。结构如下所示: typedef struct bullet { int x, y; struct bullet * next; } BULLET; 。。。我使用 BULLET * b; b = malloc(sizeof(BULLET)); // sizeof(BULLET) is 16 然后,通过简单地调用free(b),结构就被释放了。然而Valgrind似乎对此并不满意,它告诉我 ==2619==

Valgrind总是唠叨,当以前的malloc'ed结构可用时,会出现内存错误。结构如下所示:

typedef struct bullet
{
  int x, y;
  struct bullet * next;
} BULLET;
。。。我使用

BULLET * b;
b = malloc(sizeof(BULLET)); // sizeof(BULLET) is 16
然后,通过简单地调用
free(b),结构就被释放了。然而Valgrind似乎对此并不满意,它告诉我

==2619== Invalid read of size 8
==2619==    at 0x40249F: ctrl_bullets (player.c:89)
==2619==    by 0x405083: loop_game (game.c:305)
==2619==    by 0x406CCA: main (main.c:47)
==2619==  Address 0x5b8d818 is 8 bytes inside a block of size 16 free'd
==2619==    at 0x4C29A9E: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2619==    by 0x402E04: rm_bullet (player.c:329)
==2619==    by 0x402485: ctrl_bullets (player.c:95)
==2619==    by 0x405083: loop_game (game.c:305)
==2619==    by 0x406CCA: main (main.c:47)
当然,我不能只分配8个字节,因为这是存储指针所需的大小,而不是结构的大小——那么为什么Valgrind一直告诉我有错误

编辑:更多可能相关的代码

void
ctrl_bullets(WINDOW * w_field, BULLETLIST * lb)
{
  if (lb->num > 0)
  {
    BULLET * b;

    for (b = lb->head; b != NULL; b = b->next) // player.c:89
    {
      if (b->x > CON_FIELDMAXX)
      {
        write_log(LOG_DEBUG, "Bullet %p is outside the playing field; x: %d; "
                  "y: %d\n", (void *) b, b->x, b->y);
        rm_bullet(w_field, lb, b);
      }
      else
      {
        mv_bullet(w_field, b);
      }
    }
  }
}

BULLET
中的8个字节很可能是下一个
字段。你可能把
&next
放在某个地方,然后在
ctrl\u项目符号(player.c:89)
中重新使用它。但既然你没有给我们看代码,我们就没什么可说的了


编辑:或者我们可以猜测,您的
next
指针形成了一个链表,并且在执行
free
时,您没有将另一个元素的
next
指针设置为
0
,而
项目符号内的8个字节很可能是
next
字段。你可能把
&next
放在某个地方,然后在
ctrl\u项目符号(player.c:89)
中重新使用它。但既然你没有给我们看代码,我们就没什么可说的了


编辑:或者我们可以猜测,您的
next
指针形成了一个链表,并且在执行
free
操作时,您没有将另一个元素的
next
指针设置为
0
。问题是您释放了b,但尝试访问b->next

valgrind告诉您的错误是,您正在访问已释放的16字节块中的8字节块(下一个指针)

如果释放b,则无法访问b->next。只需将其存储在tmp变量中:P


(另外,请记住在释放b后将其设置为null,这样您就没有a)

问题是您释放了b,但随后尝试访问b->next

valgrind告诉您的错误是,您正在访问已释放的16字节块中的8字节块(下一个指针)

如果释放b,则无法访问b->next。只需将其存储在tmp变量中:P


(另外,请记住在释放b之后将其设置为null,这样就不会有a)

好的,使用temp变量并相应地更改for循环似乎是可行的。现在,我只需编辑这个错误的所有其他事件,就可以从Valgrind突然声称发现的21个上下文中删除新的420480个错误-这就是生活好的,使用temp变量并相应地更改for循环似乎是可行的。现在,我只需编辑这个错误的所有其他事件,就可以从Valgrind突然声称发现的21个上下文中删除新的420480个错误-这就是生活