我有一棵二叉树在玩游戏,用来猜用户的猜测。在我试图释放二叉树之前,一切都很顺利。我用英勇检查,他们给了我这些:
==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;
}我没有在这里粘贴我所有的程序,因为它真的是一个很长的版本。我的免费()功能有什么问题?我如何调试它?我不知道怎么用“英勇记录”来修正我的程序。
发布于 2015-11-26 15:07:19
要调试动态内存管理:计数对malloc()、calloc()、realloc(NULL, ...)和strdup()的所有调用,将它们加起来,然后计数对free()的所有调用,不包括对free(NULL)的调用。如果没有发现错误,前者和后面的计数将匹配。
请注意:如果上面提到的两个计数匹配,这并不意味着内存管理是正确的。
发布于 2015-11-26 14:53:46
就这么简单:
void freeTree(node *root)
{
if (!root )
return;
freeTree(root->no);
freeTree(root->yes);
free(root);
return;
}发布于 2015-11-26 14:57:14
在我看来,错误可能不是由空闲函数引起的,而是由代码中的其他地方引起的。在我看来,你的免费函数看起来还不错,尽管它可能更简单,就像milevyo的答案一样。如果我不得不猜测,我会说您没有正确地初始化为null的yes和no指针。默认情况下,它们将指向某些无效内存。在添加新节点时,需要将它们设置为null。如果你发布了其余的代码,那会有帮助的。
事实上,我只是看了一下评论,你说你打了免费电话给打印。只要您在调用freeTree后将根节点设置为null (假设您的打印函数正确处理空空树),这就可以工作。我注意到这个函数不会改变根节点,即使它释放了根节点。空闲函数不会更改指针的值,该指针仍将指向相同的位置。为了安全起见,在释放指针之后,我总是将指针设置为null。
https://stackoverflow.com/questions/33941261
复制相似问题