首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不能正确释放二叉树,我如何调试它?

我不能正确释放二叉树,我如何调试它?
EN

Stack Overflow用户
提问于 2015-11-26 14:37:28
回答 3查看 195关注 0票数 0

我有一棵二叉树在玩游戏,用来猜用户的猜测。在我试图释放二叉树之前,一切都很顺利。我用英勇检查,他们给了我这些:

代码语言:javascript
复制
==8205== Invalid read of size 8
==8205==    at 0x400F0A: treePrint (in /home/mbax4nc2/COMP26120/ex6/pangolin)
==8205==    by 0x400A14: main (in /home/mbax4nc2/COMP26120/ex6/pangolin)
==8205==  Address 0x4c334a8 is 200 bytes inside a block of size 216 free'd
==8205==    at 0x4A06430: free (vg_replace_malloc.c:446)
==8205==    by 0x400DEE: freeTree (in /home/mbax4nc2/COMP26120/ex6/pangolin)
==8205==    by 0x400A08: main (in /home/mbax4nc2/COMP26120/ex6/pangolin)

typedef struct node{
    char name[100];
    char question[100];
    struct node *yes;
    struct node *no;
}node;

void freeTree(node *root)
{ //Tree's root note is passed as argument
  if (root == NULL)
  {
    return;
  }

  if (root->no != NULL)
  {
    freeTree(root->no);
    root->no = NULL;
  }

  if (root->yes != NULL)
  {
    freeTree(root->yes);
    root->yes = NULL;
  }

  free(root);

  return;
}

我没有在这里粘贴我所有的程序,因为它真的是一个很长的版本。我的免费()功能有什么问题?我如何调试它?我不知道怎么用“英勇记录”来修正我的程序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-26 15:07:19

要调试动态内存管理:计数对malloc()calloc()realloc(NULL, ...)strdup()的所有调用,将它们加起来,然后计数对free()的所有调用,不包括对free(NULL)的调用。如果没有发现错误,前者和后面的计数将匹配。

请注意:如果上面提到的两个计数匹配,这并不意味着内存管理是正确的。

票数 2
EN

Stack Overflow用户

发布于 2015-11-26 14:53:46

就这么简单:

代码语言:javascript
复制
void freeTree(node *root)
{ 
    if (!root )
        return;

    freeTree(root->no);
    freeTree(root->yes);
    free(root);
    return;
}
票数 1
EN

Stack Overflow用户

发布于 2015-11-26 14:57:14

在我看来,错误可能不是由空闲函数引起的,而是由代码中的其他地方引起的。在我看来,你的免费函数看起来还不错,尽管它可能更简单,就像milevyo的答案一样。如果我不得不猜测,我会说您没有正确地初始化为null的yes和no指针。默认情况下,它们将指向某些无效内存。在添加新节点时,需要将它们设置为null。如果你发布了其余的代码,那会有帮助的。

事实上,我只是看了一下评论,你说你打了免费电话给打印。只要您在调用freeTree后将根节点设置为null (假设您的打印函数正确处理空空树),这就可以工作。我注意到这个函数不会改变根节点,即使它释放了根节点。空闲函数不会更改指针的值,该指针仍将指向相同的位置。为了安全起见,在释放指针之后,我总是将指针设置为null。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33941261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档