我只是想让这个 while 循环遍历 party -> fragments 的每个插槽并释放每个点,如果它不是 NULL,但是当我去运行它时,它似乎陷入了无限循环。如果我插入一个 else 并在其中中断,它会运行,但我仍然有内存泄漏。

  while(i < party -> num_active_fragments)
  {
    if(party -> fragments[i] != NULL)
    {
      free(party -> fragments[i]);
      i++;
    }
  }

最佳答案

您获得无限循环的原因是 i 仅在 party->fragments[i] 不是 NULL 时才会增加。

对这种类型的循环使用 for 并且不修改循环体内部的循环索引不太容易出错:

for (i = 0; i < party->num_active_fragments; i++) {
    if (party->fragments[i] != NULL) {
        free(party->fragments[i]);
    }
}

此外,您可以将空指针传递给将忽略它们的 free,并且您应该将释放的指针设置为 NULL 以避免以后引用:

for (i = 0; i < party->num_active_fragments; i++) {
    free(party->fragments[i]);
    party->fragments[i] = NULL;
}

关于c - 在 while 循环中释放内存不断陷入无限循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60133360/

10-13 07:34