Probleme mit free



  • Hallo zusammen,
    ich hab eine Problem mit einem C-Programm mit free und zwar:
    ich reserviere mir zunächst Speicher mit malloc in der main Funktion und arbeite dann damit in ein paar anderen Funktionen. Ganz zum Schluss möchte ich den Speicher wieder hergeben, aber das führt zu einem Programmabsturz. Ich verstehe das nicht, wie kann die Variable intern noch verwendet werden, wenn ich doch schon ganz am Ende der main()-Funktion bin, das Programm also schon komplett abgearbeitet wurde?? 😕

    Wäre euch für Hilfe dankbar 🙂
    Grüße, sunny.



  • Zeig mal ein bisschen Code...



  • Ja das Problem ist, dass es sich hierbei um ein bisschen ein laengeres Programm handelt...
    Ich hab jetzt hier nur mal die main()-Funktion, aber die sagt leider nicht wirklich viel:

    int main()
    {
      int i,j, m, n, pivotspalte, pivotzeile, hilf, k, rueckgabe, resultat;
      double **A;
      double **T;
      double *c, *b, *p, wert;
      int *J;
    
      printf("Zeilenzahl der Simplex-Matrix eingeben: ");
      scanf("%d", &m);
      printf("Spaltenzahl der Simplex-Matrix eingeben: ");
      scanf("%d", &n);
    
      //Matrizen und Hilfsvektoren generieren. Hierbei: J ist Vektor der Laenge m;
      //Eintraege: 0 oder 1. 0 (1) an der i-ten Stelle bedeutet: i (k)ein Basisindex
      A=malloc(sizeof(double)*m);
      for(i=0;i<m;i++) A[i]=malloc(sizeof(double)*n);
    
      c=malloc(sizeof(double)*n);
      b=malloc(sizeof(double)*m);
      J=malloc(sizeof(int)*n);
      p=malloc(sizeof(double)*n);
    
      T=malloc(sizeof(double)*(m+1));
      for(i=0;i<(m+1);i++) T[i]=malloc(sizeof(double)*(n-m));
    
      eingab2(A,c,b,m,n);
      rueckgabe=phas1(A,c,b,m,n,p,J);
      if(rueckgabe==1) resultat=phas2(A,c,T,p,b,J,m,n);
      if(rueckgabe==(-1)) resultat=-2;
      if(rueckgabe==0) resultat=-3;
    
      //Speicherplatz wieder freigeben:
      //free(A); free(c); free(T); free(b); free(p); //free(J);
      return resultat;
    }
    

    Genau bei free(J) kommt es zum Absturz...

    Grüße,
    sunny.



  • sunnyberny schrieb:

    Genau bei free(J) kommt es zum Absturz...

    Hast du mal die Adresswerte von J bei malloc und free verglichen? Zum Code von dir kann man jedenfalls nichts konkretes sagen, da es einfach zu wenig ist.

    btw:

    sunnyberny schrieb:

    A=malloc(sizeof(double)*m);
    [...]
    T=malloc(sizeof(double)*(m+1));
    

    Sollte das nicht eher woe folgt aussehen

    A=malloc(sizeof(double*)*m);
    [...]
    T=malloc(sizeof(double*)*(m+1));
    

    ?

    Und warum diese verschachtelte Speicherreservierung, und nicht einfach linear?

    double* A = malloc(sizeof(double) * m * n);
    double* T = malloc(sizeof(double) * (m+1) * (n-m));
    


  • ein absturz beim free kann oft daraus resultieren, dass du über die arraygrenze hinaus schreibst, musste mal danach schauen. (hab deinen source jetzt nicht beguckt)



  • @sunnyberny

    1. Benutze bitte aussagekräftige Variablennamen. Bei einer Zählvariablen für eine for-Schleife oder so, sag ich ja nichts, wenn es nur ein Buchstabe ist. Aber bei den anderen sachen, kommt man einfach nicht mehr mit, wenn da nur ein Buchstabe steht.

    2. Du musst, wenn dann schon alles wieder mit free() freigeben, was du auch mit malloc() reserviert hast, d. h. wirklich ALLES!

    A und T sind Zeiger auf Zeiger und reservierst bei diesen beiden in zwei Dimensionen. Beim Freigeben berücksichtigst du das aber nicht!



  • bei mehrdimensionalen dynamischen arrays solltest du auch aufpassen auf:
    NICHTS FREIGEBEN WAS NOCH BENÖTIGT WIRD - auch wenn es "nur" noch für ein free benötigt wird.


Anmelden zum Antworten