如何释放指针而不释放内容?辅助变量

时间:2019-05-17 22:09:46

标签: c pointers memory-management binary-search-tree free

为了学习这种语言,我正努力解决越来越多的内存泄漏。 我正在处理的程序是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吗?如果可以,我该如何避免呢?

2 个答案:

答案 0 :(得分:2)

指针本身在自动存储中,这意味着您不必担心分配或释放它。因此,不是您需要担心的 pointer ,而是指针所指向的 memory 。这就是free发挥作用的地方。 free不会释放指针,而是释放指针所寻址的内存。

  

它还会取消tree->root->l吗?

它将释放auxtree->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指针来跟踪所有内容,并可以在程序结束时将其清除,或者当您不再需要树时。