0

我正在编写一个使用二叉树数据结构的程序。在编写释放所有节点的例程时,我遇到了一个我无法解释的特殊问题。

这是常规:

void destroy_tree(NodeT **tree){

    if( *tree != NULL ){
        destroy_tree( &(*tree)->left );
            free( (*tree)->left );
        destroy_tree( &(*tree)->right );
            free( (*tree)->right );
    }
    return;
}

基本上一个 2 星指针被传递给函数。它在继续释放指针之前检查每个节点是否为 NULL。NodeT是一个包含指向 NodeT 结构的左右指针的结构;这些是我试图释放的指针。

结构定义为:

typedef struct{
    int val;
    struct tnode *right, *left;
}NodeT;

如果没有 free() 调用,任何事情都不会像您期望的那样发生。但是,当取消注释免费呼叫时,输出如下所示:

在此处输入图像描述

每次我运行程序时,数字块都会改变,但它们总是重复并最终崩溃。

对这个函数的原始调用是你所期望的,

destroy_tree(&rootNode); 

其中 rootNode 是:NodeT *rootNode;

有任何想法吗?

4

2 回答 2

3

尝试释放当前节点:

void destroy_tree(NodeT **tree){

    if( *tree != NULL ){
        destroy_tree( &(*tree)->left );
        destroy_tree( &(*tree)->right );
        free(*tree);
    }
    return;
}
于 2013-10-30T15:55:59.240 回答
1

你没有说你正在运行什么样的系统,但我猜想打印来自一个抱怨堆损坏的堆诊断例程。

所以问题可能是你的树实际上不是一棵树 - aNodeT在树中出现两次(所以它是一个 DAG),或者更糟糕的是,其中一个指针指向父级(树中有一个循环。)要么其中会导致堆损坏(未定义的行为),这可能导致任何事情发生。

我建议使用valgrind或其他一些堆调试工具来缩小范围,但这仍然不会告诉你真正的问题在哪里(这是在创建树的代码中的某个地方。)

于 2013-10-30T16:55:14.063 回答