C - 这些函数生成垃圾吗?

时间:2011-02-07 02:05:18

标签: c

我不认为他们这样做,因为delete使用free()函数,只替换更改值,并且不创建新节点。我问,因为我来自Java,而且我是内存分配的新手。

IntNodePtr delete(int i, IntNodePtr p) {
  /* End of list check */
  if(p == NULL)
    return NULL;

  /* Check if current node is the one to delete */
  if(p->myInt == i) {
    IntNodePtr temp;
    temp = p->next;

    free(p);
    return temp;
  }

  p->next = delete(i, p->next);
  return p;
}

IntNodePtr replace(int i, int j, IntNodePtr p) {
  if(p == NULL)
    return NULL;

  if(p->myInt == i)
    p->myInt = j;

  p->next = replace(i, j, p->next);
  return p;
}

4 个答案:

答案 0 :(得分:1)

在C中,我们不调用不再使用“垃圾”的已分配内存,而是“内存泄漏”。

您只需要free使用malloc分配的内存。在这种情况下,您的所有函数都不会调用malloc,因此它们不需要free任何内容。 (虽然delete函数看起来是free在程序中的其他地方分配的内存。也没关系。)

答案 1 :(得分:1)

deletefree对象,因为一旦指针被替换,就无法访​​问它。一切都很好。

仅在replace个对象中进行修改。没有任何内容被创建或销毁,因此不会涉及mallocfree

请注意,如果列表太长,这些函数可能会导致堆栈溢出错误。此外,replace始终返回其参数p,因此不需要返回任何内容。在函数末尾留下尾部调用代替p->next = replace( …会(除了)之外的所有内容都会消除堆栈溢出风险。将delete重新编码为循环也可能更安全一些。

答案 2 :(得分:0)

  if(p->myInt == i) {
    IntNodePtr temp;
    temp = p->next;

    free(p);
    return temp;
  }

此代码值得怀疑。你如何处理返回的指针?对我来说,好像你删除链表中间的一个节点而不关心以前的“下一个指针”。删除p后,前一个下一个指针将指向无效内存。即你切断了中间的清单。

答案 3 :(得分:-2)

在C中,当调用free时生成“garbage”,C中没有“垃圾收集”;除非它已经实施 - 如果我说的是显而易见的!因此,删除会产生“垃圾” - 关于替换你的观察是正确的。