如何在不释放内容的情况下释放指针?辅助变量

How to free pointer without freeing contents? An aux variable

在学习这门语言的过程中,我越来越多地尝试解决内存泄漏问题。 我正在处理的程序是二叉搜索树,树的根始终位于 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 吗?如果是这样,我该如何避免?

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

will it also dealocate tree->root->l?

它将释放 auxtree->root->l 指向的内存。

有问题的内存仍在被树使用,因此此时不应释放它。

how do I avoid it if so?

删除 free(aux);.

Does this mean that if I leave variables like this it wouldn't cause a memory leak or unnecessarily used recourse?

正确。您需要问自己的问题是 "is the memory addressed by this pointer still being used?" 如果答案是肯定的,请不要释放它。如果答案是否定的,请释放它。

是的,tree->root->l 将被释放,因为 aux 指向同一内存。您有两个指向同一内存位置的指针。将任一指针传递给 free() 将释放它们指向的内存。

您可以通过不传递指向您不想释放的内存位置的释放指针来避免它。

听起来你在问如何在不释放 tree->root->l 的情况下使用 aux 指向其他东西。为此,您只需重新分配 aux:

aux = some_other_pointer;

只要您保留一个指针某处,它仍然指向稍后需要释放的内存,就不需要释放任何东西。

根据您的评论:"I had the idea that you need to free all variables when youre done with them."这几乎是正确的。您必须释放所有 动态分配的 内存。您无需尝试释放未通过调用 malloc 分配的任何内容,因此无需在 aux 上调用 free。您需要在某个时候对二叉树中的每个元素调用 free,但您仍然有 root 指针来跟踪所有这些,并且可以在程序结束时清理它或当你不再需要这棵树时。