尝试从二进制树中释放内存时出错。

问题描述 投票:1回答:1

我试图释放内存递归,当我试图显示到树,显示一个消息,树已被释放.删除的代码是

void stergereArbore(ArboreBin*rad) {
    if (rad) {
        stergereArbore(rad->st);
        stergereArbore(rad->dr);
        free(rad->avion.model);
        free(rad->avion.preturi);
        free(rad);
    }
}

而用于展示的是

void afisareSRD(ArboreBin*a) {
    if (a) {
        afisareSRD(a->st);
        afisareAvion(a->avion);
        afisareSRD(a->dr);
    }
    else {
        printf("Empty");
    }
}

和错误信息。我对数据结构有点陌生,也许我拼错了什么。enter image description here

c binary-tree binary-search-tree pass-by-reference free
1个回答
1
投票

该函数处理的是树的头部指针的副本。所以改变副本不会影响到树的原始头部指针。

要么你应该通过对函数的引用传递头部指针,要么你应该从函数中返回头部指针,调用者可以将其设置为NULL。

这里有两种方法

void stergereArbore( ArboreBin **rad ) 
{
    if ( *rad ) 
    {
        stergereArbore( &( *rad )->st );
        stergereArbore( &( *rad )->dr );
        free( *rad );
        *rad = NULL;
    }
}

而函数的调用方式可以是

ArboreBin *rad = NULL;

//...

stergereArbore( &rad ); 

ArboreBin * stergereArbore( ArboreBin *rad ) 
{
    if ( rad ) 
    {
        rad->st = stergereArbore( rad->st );
        rad->dr = stergereArbore( rad->dr );
        free( rad );
        return NULL;
    }
}

而函数的调用方式可以是

ArboreBin *rad = NULL;

//...

rad = stergereArbore( rad ); 
© www.soinside.com 2019 - 2024. All rights reserved.