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ß Juri

    Update:

    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 🙂


Anmelden zum Antworten