如何在不释放内容的情况下释放指针?辅助变量
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
?
它将释放 aux
和 tree->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
指针来跟踪所有这些,并且可以在程序结束时清理它或当你不再需要这棵树时。
在学习这门语言的过程中,我越来越多地尝试解决内存泄漏问题。
我正在处理的程序是二叉搜索树,树的根始终位于 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
?
它将释放 aux
和 tree->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
指针来跟踪所有这些,并且可以在程序结束时清理它或当你不再需要这棵树时。