free() auf complexe Datenstrukturen, rekursiv?
-
Hey,
Ich wollte nur eben fragen ob jemand weiß ob C bei free quasi rekursiv die Datenstruktur freigibt oder ob das vorher einzeln gemacht werden muss. Soll heißen, ich habe eine Struct das so in etwas aussehen könnte:
typedef struct { WORD *m_pArray; WORD m_wOffset; //Next free Offset } EigenesArray;
Wenn ich jetzt nen pointer auf mehrere dieser Arrays anlege also
EigenesArray *VieleArrays = malloc(5 * sizeof(EigenesArray)); VieleArrays[2].m_pArray = malloc(100 * sizeof(WORD));
kann ich dann einfach sagen free(VieleArrays) und der Speicher vom zweiten Malloc wird auch freigegeben? oder muss ich den vorher explizit freigeben?
-
Jedes malloc braucht ein free.
-
Musst Du vorher machen. Also schön in umgekehrter Reihenfolge, weil ja sonst der innere Zeiger nicht mehr verfügbar ist.
-
Super, danke für die schnellen Antworten
-
Hallo,
ich möchte mich hier anschließen, da ich ein passendes Problem habe.
In meinem Programm gibt es 3 Strukturen. Struktur 1 beinhaltet Struktur2 und Struktur 2 beinhaltet Struktur 3. Das habe ich alles über Pointer gemacht.
Nun will ich den Speicher, den ich alloziert habe wieder mit free() freigeben.
Leider funktioniert das noch nicht ganz.Hier der Quellcode/Erklärung
modul_ptr zeigt auf Struktur 1;
pi zeigt auf Struktur 2;
p_entry auf Struktur 3;int i,j; for(i=0; i<5; i++){ for(j=0; j<=5 j++){ free(modul_ptr[i].pi[j].p_entry); //Das funktioniert }//for2 free(modul_ptr[i].pi); //Hier tritt der Fehler auf }//for1 free(modul_ptr); //Das funktioniert auch printf("\n free modul_ptr");
Mit den 2ten free() will ich den angeforderten Speicher freigeben, der mit pi alloziert wurde.
Gruß
Juri
-
Kannst du uns mal zeigen, wie du den Speicher reservierst und sagen was für ein Fehler auftritt?
-
Ja das kann ich machen, leider kann ich das Programm nicht ausführen wenn ich
im Internet bin. Deshalb so kurz erläutert.Zum Fehler: In der Konsole, die durch das Ausführen gestartet wird, steht :
detected in free() ...Invalid pointer etc...Anlegen der ersten Struktur
slave *modul; //Zeiger von der Struktur Slave . Das ist Struktur 1 modul=malloc(sizeof(slave)); //Anlegen von Speicher. Es wird Speicher der Größe von slave angelegt modul = realloc(modul, 10 * sizeof(slave)); //Umständlich aber ich wollte es mal ausprobiert haben
modul_ptr zeigt auf Modul, also beide auf die gleiche Stelle;
Anlegen der 2ten Struktur
modul[index_slave].pi=malloc(sizeof(struct pdo_info)); //pdo_info ist die Struktur 2 //Falls nötig vergrössern modul[index_slave].pi=realloc(modul[index_slave].pi,(index_pdo_info+1)*sizeof(struct pdo_info));
Anlegen der 3ten Struktur
modul[index_slave].pi[index_pdo_info].p_entry=malloc(sizeof(struct pdo_entry)); //pdo_entry ist Struktur 3 //Falls nötig, erweitern modul[index_slave].pi[index_pdo_info].p_entry=realloc(modul[index_slave].pi[index_pdo_info].p_entry,(index_pdo_entry+1)*sizeof(struct pdo_entry));
Das habe ich aus den Quelltext kopiert.
Das Anlegen und das Benutzen aller Elemente funktioniert sehr gut, nur das Freigeben nicht.Gruß Juri
-
Halt nicht darüber den Kopf zerbrechen. Beim Debuggen ist mir aufgefallen, dass nicht jede Struktur 1 mit dem Zeiger pi ein malloc() Befehl ausführt. Werde es umprogrammieren und wieder posten.
Gruß JuriUpdate:
so nun habe ich den Fall behandelt, falls mit dem Zeiger pi kein Speicher alloziert wurde, auch keine free() Befehl kommt.
Klappt nun, habe mal 1h malloc() und free() in einer Schleife laufen lassen