在堆上释放内存,特殊树

时间:2014-09-22 17:52:04

标签: c memory tree heap free

我有一个树形结构 node {node * left,node * right}。 我这样填写: 让我们说A是根。 孩子A1和A2。 然后是A11和A12,是A11的孩子。 最后A12(= A21)和A22是A22的孩子。 所以A11和A12有一个共同的孩子,我没有复制孩子,我们只有A12 = A21(在地址方面)。 但是要释放树,我唯一的方法是使用recursif函数: 释放树T(由指针节点*表示),释放两个子子(如果它们存在)(即非NULL),然后使用free(T)。 问题是当recursif调用在A21上时,指针将被释放(因为A21 = A12并且之前在A12上发出recursif调用),这会导致问题。 我该怎么解决? 感谢。

EDIT。 我试图通过在结构中添加一个代表正确兄弟的新字段来修复它, 它可能有效,因为valgrind没有注意到任何记忆丧失:D。

#include <stdio.h>
#include <stdlib.h>
struct node{
    struct node *lc, *rc, *bro; // left child, right child, brother
};
typedef struct node node;

void release(node *n)
{
    if(n->lc)
        release(n->lc);
    if(n->rc){
        if(n->bro) // in that case, n and n->bro have a common node
            n->bro->lc = NULL; // so i set it to NULL because it must be released only once
        release(n->rc);
    }
    free(n);
}

int main()
{
    node *A22 = malloc(sizeof *A22);
    A22->lc = A22->rc = A22->bro = NULL;

    node *A21 = malloc(sizeof *A21);
    A21->lc = A21->rc = NULL;
    A21->bro = A22;

    node *A2 = malloc(sizeof *A2);
    A2->lc = A21;
    A2->rc = A22;
    A2->bro = NULL;

    node *A11 = malloc(sizeof *A11);
    A11->lc = A11->rc = NULL;
    A11->bro = A11;

    node *A12 = A21; // the duplicated node

    node *A1 = malloc(sizeof *A1);
    A1->lc = A11;
    A1->rc = A12;
    A1->bro = A2;

    node *A = malloc(sizeof *A); // root
    A->lc = A1;
    A->rc = A2;
    A->bro = NULL;

    release(A);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

它很粗糙,但你可以维护一个被释放的节点的全局列表(按每个节点的地址),这样你就可以引用它并避免重新释放任何节点。