我不认为他们这样做,因为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;
}
答案 0 :(得分:1)
在C中,我们不调用不再使用“垃圾”的已分配内存,而是“内存泄漏”。
您只需要free
使用malloc
分配的内存。在这种情况下,您的所有函数都不会调用malloc
,因此它们不需要free
任何内容。 (虽然delete
函数看起来是free
在程序中的其他地方分配的内存。也没关系。)
答案 1 :(得分:1)
在delete
你free
对象,因为一旦指针被替换,就无法访问它。一切都很好。
仅在replace
个对象中进行修改。没有任何内容被创建或销毁,因此不会涉及malloc
和free
。
请注意,如果列表太长,这些函数可能会导致堆栈溢出错误。此外,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中没有“垃圾收集”;除非它已经实施 - 如果我说的是显而易见的!因此,删除会产生“垃圾” - 关于替换你的观察是正确的。