我试图释放内存递归,当我试图显示到树,显示一个消息,树已被释放.删除的代码是
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");
}
}
该函数处理的是树的头部指针的副本。所以改变副本不会影响到树的原始头部指针。
要么你应该通过对函数的引用传递头部指针,要么你应该从函数中返回头部指针,调用者可以将其设置为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 );