我的程序管理结构的链表。

这是我的结构:

typedef struct wagon wagon;
typedef struct wagon{
    wagon *next;
    marchandise_ptr *liste;
    double volume_courant;
}train_ptr;


其中wagon * next是指向链接列表的下一个“单元格”的指针,而marchandise_ptr * list是指向另一个链接列表的指针。要释放结构,请按照以下步骤操作:

在int main()中:

train_ptr *train=creer_un_train(...)//so train is the beginning of my linked list
liberer_train(&train);


我的职能是:

创建一个“货车”

wagon *creer_wagon(marchandise_ptr *liste,double volume_courant){ //it creates a wagon
    assert(volume_courant>=0);
    wagon *wag=malloc(sizeof(wagon));
    if(wag==NULL)
        return NULL;
    wag->next=NULL;
    wag->volume_courant=volume_courant;
    wag->liste=liste;
    return wag;
}


在链表的末尾添加创建的“旅行车”:

train_ptr *ajouter_wagon_a_la_fin_du_train(train_ptr *train,double volume_courant, marchandise_ptr *liste){
    wagon *wag=creer_wagon(liste,volume_courant);
    if(wag==NULL)
        return NULL;
    if(train==NULL)
        train=wag;
    else{
        train_ptr *wag_current=train;
        while(wag_current->next!=NULL)
            wag_current=wag_current->next;
        wag_current->next=wag;
        }
    return train;
}


创建火车:

train_ptr *creer_un_train(unsigned int nombre_de_wagons,marchandise_ptr *liste){
    assert(nombre_de_wagons>=0);
    int i;
    train_ptr *train=NULL;

    for(i=0;i<nombre_de_wagons;i++){
        train=ajouter_wagon_a_la_fin_du_train(train,rand()%10,liste);
        if(train==NULL)
            return NULL;
        }
    return train;
}


免费搭乘火车:

void liberer_train(train_ptr **train){
    train_ptr *p_current = *train;
    while(p_current!=NULL){
                *train = p_current->next;
                p_current->next=NULL;
                free(p_current->liste);
                free(p_current);
                p_current = *train;
    }
}


P.S .: liste是指向链接列表的beginnig的指针:

typedef struct marchandise marchandise;
typedef struct marchandise{
    double volume;
    double volume_total;
    char nom;
    marchandise *suivant;
}marchandise_ptr;


感谢您的关注! (对不起我的英语,我不是母语人士。...:D)

最佳答案

从您的creer_wagon函数看来,liste函数似乎没有释放liberer_train,因为它不是由creer_wagon函数分配的。

按照这种逻辑,调用creer_wagon的函数应该负责liste成员,因为在调用者函数的范围内,您将有一个指向该函数的有效指针,并且可能会出现一个双重free的风险。 liste成员的名称。

如果每个train只需要引用一个liste而不需要修改它,则可以这样定义结构

typedef struct wagon{
    wagon *next;
    const marchandise_ptr *liste;
    double volume_courant;
}train_ptr;


这样可以防止意外尝试修改或free liste成员。

这种设计在许多火车可以指向同一liste的情况下是有意义的,尽管它增加了struct wagon用户的责任,因为他们应该照顾liste成员的内存管理。如果是这种情况,我会双重推荐const限定词。

我认为这是推理liste是否由您分配的有效方法。

我建议您像这样修复liberer_train函数

void liberer_train(train_ptr **train) {
    train_ptr *p_current = *train;
    train_ptr *suivant   = NULL;
    while (p_current != NULL) {
        suivant = p_current->next;
        free(p_current);
        p_current = suivant;
    }
    /* make the pointer NULL, so it's not a dangling pointer in the caller function anymore. */
    *train = NULL;
}


而且,我建议你改变

typedef struct wagon train_ptr;




typedef struct wagon *train_ptr;


要么

typedef struct wagon train;


例如,因为后缀_ptr使人想到train_ptr x; x中的指针是指针,而实际上不是。

关于c - 释放结构...我不确定是否做对了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27906984/

10-09 12:50