【问题标题】:Valgrind reports a memory error when trying to free a malloc'ed structValgrind 在尝试释放 malloc 的结构时报告内存错误
【发布时间】:2012-06-12 10:44:52
【问题描述】:

当先前 malloc 的结构被释放时,Valgrind 总是抱怨存在内存错误。该结构如下所示:

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

【问题讨论】:

    标签: c memory valgrind


    【解决方案1】:

    问题是你释放了b,然后尝试访问b->next

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

    如果你释放 b,你就不能访问 b->next。只需将其存储在 tmp 变量中即可:P

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

    【讨论】:

    • 好的,使用临时变量并相应地更改 for 循环似乎可行。现在我只需要编辑这个错误的所有其他事件,以摆脱 Valgrind 突然声称发现的来自 21 个上下文的新 420480 错误 - 这就是生活! :)
    【解决方案2】:

    BULLET 中的 8 个字节很可能是字段 next。您可能已将&next 保留在某处并在ctrl_bullets (player.c:89) 中重复使用它。但是由于您没有向我们展示该代码,因此我们不能多说。

    编辑: 或者我们可以猜测您的 next 指针形成了一个链表,并且您在执行 @ 时没有将另一个元素的 next 指针设置为 0 987654328@.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2020-12-04
      • 2012-01-27
      • 2017-02-25
      • 2015-07-13
      • 1970-01-01
      相关资源
      最近更新 更多