1

修复:问题在于递归而不是指针。当它通过每次递归返回时,它会将返回的 VAR 重置为旧的主树。通过制作一个全局 VAR 并在返回之前设置它然后使整个函数返回无效来修复。没有内存泄漏。

我正在尝试将 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);

指针让我发疯。我错过了什么?

4

1 回答 1

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指向的。否则,它看起来确实应该返回根节点。

于 2013-02-14T06:48:24.847 回答