Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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
C 这些函数会产生垃圾吗?_C - Fatal编程技术网

C 这些函数会产生垃圾吗?

C 这些函数会产生垃圾吗?,c,C,我认为不会,因为delete使用free()函数,replace只更改值,不生成新节点。我这么问是因为我来自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) {

我认为不会,因为delete使用free()函数,replace只更改值,不生成新节点。我这么问是因为我来自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;
}

在C中,当调用free时生成“垃圾”,在C中没有“垃圾收集”;除非已经实施——如果我说的是显而易见的,那就很抱歉了!因此,delete将生成“垃圾”——因为您的观察是正确的。

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


您只需
释放以前使用
malloc
分配的
内存。在这种情况下,没有函数调用
malloc
,因此它们不需要
free
任何东西。(虽然
delete
函数看起来像是
释放了程序中其他地方分配的内存。这也很好。)

delete
中,您
释放了对象,因为一旦指针被替换,将无法访问它。那里一切都好

replace
中,仅在位修改对象。没有创建或销毁任何内容,因此不涉及
malloc
free

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

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

    free(p);
    return temp;
  }

<>这个代码是有问题的。你用返回的指针做什么?对我来说,好像你在链表中间删除一个节点,而不关心前面的“下一个指针”。在P被删除后,前一个指针将指向无效内存。也就是说,在中间删除列表。< /p>如何<代码>免费/代码>生成垃圾?我想投票否决这一点,因为它完全没有帮助,如果不是不准确的话。- 1:我盯着这个答案2分钟,我还是不明白。垃圾(又名内存泄漏)。是未调用
free
时生成的内容。我想知道这个“应答器”对英语有很好的掌握。我想答案是,一旦你
空闲
,内存的内容现在是不确定和禁止的——而不是在
空闲
调用之前,当你有很好的有效内存时——现在在
空闲
调用之后,指针指向垃圾?(虽然这没关系,因为如果你在
free
之后使用指针,你只是在要求它)@user470379-谢谢@Chris,@JimR-是的,我在构建答案时应该小心考虑你如何使用这两种方法,它们在我看来都很好。虽然在C中调用函数
delete
是完全合法的,但我强烈建议将其重命名为其他函数(例如
delete\u node
)请记住C++的代码在所有权问题上是不规则的。他可能不会直接分配内存,仍然必须释放它,因为他调用的API返回了一些动态分配的内存。“因此,它们不需要释放任何东西”。我同意删除递归。永远不要为了递归而编写递归函数。在这个特殊的程序中,它做了两件事:1)大大降低代码的速度,2)降低代码的可读性。