FIXED:问题在于递归而不是指针。当它通过每次递归返回时,它会将返回的VAR重置为旧的maintree。通过创建全局VAR并在返回之前设置它然后使整个函数返回void来修复。没有内存泄漏。
我正在尝试将malloc指针地址传递给main()中的指针变量。
代码可以解决问题。它不是将指针地址从FinalTree传递回main,而是创建一个新副本,这意味着我无法释放()在FinalTree()中使用malloc的内存。当我进行内存检查时,我留下了一些未释放的内存。
以下是目前的代码:
Tree* FinalTree(Forest** forest, int FinalFreq)
{
Tree* maintree = mktree(); //this function calls malloc and have to use it
Tree* tree1 = pick(*forest);
Tree* tree2 = pick(*forest);
maintree->frequency = tree1->frequency + tree2->frequency;
maintree->left = tree1;
maintree->right = tree2;
//Make sure forest isnt barren
if (maintree->frequency != FinalFreq)
{
plant(*forest, maintree);
FinalTree(forest, FinalFreq);
}
return maintree;
}
这是从main()调用的:
Tree* tfinal = FinalTree(&finit, header.checksum);
指针让我疯了......我错过了什么?
答案 0 :(得分:0)
如果我完全不理解你的问题,请原谅我,但根据评论,我认为我知道你现在指的是什么。
该函数创建树,但只返回顶级根节点的地址。你的问题是如果你free()
那个,树的其余部分仍然分配,对吗?如果是这样,我认为解决这个问题的方法是编写一个专用的FreeTree(Tree *)
函数,该函数遍历树,free()
是备份路径上的各个叶节点。
像(未经测试)的东西:
void FreeTree(Tree *tree) {
if (tree == NULL)
return;
FreeTree(tree->left);
FreeTree(tree->right);
free(tree);
}
更新:好的。这确实很奇怪。我没有在函数中看到任何会改变创建它的maintree
之外的mktree()
。除非plant
引用指针:
void plant(Forest forest, Tree *&tree)
然后plant()
可以修改指向maintree
的指针。否则它看起来应该返回根节点。