C 这些函数会产生垃圾吗?
我认为不会,因为delete使用free()函数,replace只更改值,不生成新节点。我这么问是因为我来自Java,对内存分配还不熟悉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) {
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)降低代码的可读性。