2016-07-16 17 views
0

kostenlos mit i, diese Strukturen haben:Wie verknüpfte Liste löschen

typedef struct tStimulus_tc 
{ 
    short    Key; 
    struct tStimulus_tc *Next; 

}Stimulus_tc; 

struct Frame_tc 
{ 
    int     ID;  // Frame ID (0..MAX) 
    int     Count; // Felt Count 
    short     sSize; // Stimulus List Size 
    Stimulus_tc   *sList; // Stimulus List 

}; 

wenn ich eine „struct Frame_tc“ befreien wollen, ist das genug?

oder ich muss durch es laufen Reiz und frei 1 von 1? Was ist der richtige Weg, um eine Variable zu befreien?

+2

Für jedes "malloc" sollte genau ein "frei" sein. – user3386109

+0

Wenn dies eine C++ Frage ist, sollten Sie 'new' und' delete' verwenden, nicht 'malloc()' und 'free()'. Oder besser noch eine Sammlung. – EJP

+1

Warum ist das C++ markiert? – MrEricSir

Antwort

2

free() nimmt einen zuvor zugewiesenen Block und gibt ihn zur Wiederverwendung frei. Es kennt den Inhalt des Puffers nicht und kümmert sich auch nicht darum.

Während Sie einen Compiler schreiben könnte, die rekursiv Zeiger freigibt, dann ist dies keine gute Idee:

static Stimulus_tc stim; 
Frame_tc *fTemp = malloc(sizeof *fTemp); 
fTemp->sList = &stim; 
fTemp->sSize = 1; 
free(fTemp); // if this recursively freed pointers, we would free a static object 

Nur Sie wissen, wie Sie Ihre Struktur aufgebaut ist, daher shoud Sie derjenige sein, es zerstörenden. In Ihrem Fall bedeutet das, dass Sie die verknüpfte Liste durchlaufen und jedes Mitglied freilassen.

In C++ ist es ratsam, Mechanismen auf höherer Ebene zu verwenden, z. B. std::vector<Stimulus_tc> oder std::list<Stimulus_tc>.

In Fällen, in denen die Zeigerverwendung unvermeidlich ist (Ihr Fall ist keine), sollten Sie die Verwendung von smart pointers in Erwägung ziehen. Und wenn Sie unbedingt Speicher auf die alte Weise verwalten müssen, use type-safe new[]/delete[].

+0

Danke :) sehr hilfreich – user3728181

+0

@ user3728181 Ich hatte übersehen, dass 'sList' ist eine verkettete Liste. Ich habe die Antwort entsprechend angepasst. Davids Antwort zeigt, wie man eine verknüpfte Liste freigibt. – a3f

2

In C, wenn Ihre Stimulus_tc Liste innerhalb des struct Frame_tc Wrapper ist keine traditionelle Kopf/Schwanz Liste (zB mit den endgültigen ->Next = NULL), aber mit der Anzahl der Knoten in list->sSize enthalten ist, könnten Sie etwas ähnliches wie die folgenden tun:

/* free all nodes in struct Frame_tc->Stimulus_tc list */ 
void free_list (struct Frame_tc *list) 
{ 

    Stimulus_tc *iter = list->sList; /* pointer to iterate list */ 
    Stimulus_tc *victim = NULL;   /* pointer to node to delete */ 
    int n = list->sSize;    /* number of nodes to delete */ 

    if (iter == NULL) { 
     fprintf (stderr,"print_list() warning: empty list.\n"); 
     return; 
    } 

    while (n--) {  /* free n nodes */ 
     victim = iter; 
     iter = iter->Next; 
     free (victim); 
    } 
} 

Wenn Sie die letzten Next Zeiger auf NULL setzen, können Sie int n = list->sSize; beseitigen und einfach über die Liste iterieren mit while (iter) { ...

Wenn es zusätzlichen poi waren nter Elemente innerhalb jedes Knotens, die zugewiesen wurden, würden Sie einfach free diese Werte vor free (victim);

Schauen Sie es sich an und lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.