为了学习这种语言,我正努力解决越来越多的内存泄漏。
我正在处理的程序是Binary Search Tree,该树的根始终位于tree->root->l
。现在,如果我这样做...
BSTNode *search(BSTree *tree ,Item elem)
{
BSTNode* aux;
aux = tree->root->l;
/*
* BSTNode not found.
*
*/
if(notFound)
{
free(aux);
free(found)
return NULL;
}
// . . . . . .
}
它还会取消tree->root->l
吗?如果可以,我该如何避免呢?
答案 0 :(得分:2)
指针本身在自动存储中,这意味着您不必担心分配或释放它。因此,不是您需要担心的 pointer ,而是指针所指向的 memory 。这就是free
发挥作用的地方。 free
不会释放指针,而是释放指针所寻址的内存。
它还会取消
tree->root->l
吗?
它将释放aux
和tree->root->l
都指向的内存。
该内存仍在由树使用,因此此时不应释放它。
如何避免?
删除free(aux);
。
这是否意味着如果我留下这样的变量,就不会引起内存泄漏或不必要的资源使用?
正确。您需要问自己的问题是“此指针寻址的内存是否仍在使用?”如果答案是肯定的,请不要释放它。如果答案是否定的,请释放它。
答案 1 :(得分:2)
是的,tree->root->l
将被释放,因为aux
指向相同的内存。您有两个指针指向相同的存储位置。将任何一个指针传递到free()
将释放它们两个都指向的内存。
通过不传递指向不希望释放的内存位置的释放指针来避免这种情况。
这听起来像是您在问如何使用aux
指向其他内容而不释放tree->root->l
。为此,您只需重新分配aux
:
aux = some_other_pointer;
只要保留指针某处仍指向内存的指针,就不需要释放任何内容。
根据您的评论:“我的想法是,当您完成所有变量后,您需要释放所有变量。”这几乎是正确的。您必须释放所有动态分配的内存。您无需尝试通过释放对malloc
的分配来释放未分配的任何内容,因此无需在free
上调用aux
。您有时需要在二叉树中的每个元素上调用free
,但是您仍然具有root
指针来跟踪所有内容,并可以在程序结束时将其清除,或者当您不再需要树时。