Zwickmühle: free() bei redundanten Listen
-
Servus,
hab irgendwie nen Verständnisproblem. Ich habe eine dreidimensionale Datenstruktur in welcher hinter jeder Koordinate nochmals eine Liste steckt. Diese Listen sind teilweise immer gleich. Um Speicherplatz zu sparen, habe ich eine einfach verkettete Liste, als Bibliothek quasi, implementiert, wo ich welche Liste schonmal hab und biege anschließend die Pointer entsprechend um. Soweit überhaupt kein Problem.
Wenn ich die Bibliothek nicht nutze kann ich wunderbar jede Liste freigeben und hab dadurch auch Laufzeitabbrüche bei der Freigabe von Speicher. Wenn ich die Bibliothek aber doch nutze, dann gibts direkt einen Laufzeitabbruch bei der Freigabe. Hab die Freigabe so implementiert ->
if (Pointer!=NULL) { free(Pointer); Pointer=NULL; }
Ich glaube das Problem ist, daß die Pointer die auf eine schon freigegebe Liste zeigen natürlich keine Nullpointer sind und ich ein free auf eine schon freigegebene Struktur durchführe, was natürlich nicht geht, kann das ?
Winn
-
Hallo!
Ein free() auf ein schon freigegebenes Listenelement verursacht nicht vorhersehbares verhalten.
Ich habe eine dreidimensionale Datenstruktur in welcher hinter jeder Koordinate nochmals eine Liste steckt.
Könntest Du ein paar Codesnipsel posten um sich ein besseres Bild zu machen?
Gruß
Michael
-
hilft jetzt zwar nicht zur Lösung des Problems, aber free() auf NULL funktioniert auch (bzw. macht nichts), womit die obige if-Abfrage nicht nötig ist.
-
DrGreenthumb schrieb:
hilft jetzt zwar nicht zur Lösung des Problems, aber free() auf NULL funktioniert auch (bzw. macht nichts), womit die obige if-Abfrage nicht nötig ist.
Das hat bei mir direkt zu Abbrüchen geführt... g++ meckert direkt, wenn free mehrmals auf NULL gemacht wird und bricht direkt mit dieser Fehlermeldung ab.
Hier mal ein Codeschnipsel:
iPtr=MyNOperator.FindInteger(ElemMax,TmpX); // Bibliothek, gibt NULL zurück, falls noch nirgends angelegt, sonst "ADR" wenn schon bekannt if (iPtr==NULL) { NPSkx(i,j,k)=(int *)calloc(ElemMax,sizeof(int)); if (NPSkx(i,j,k)==NULL) { fprintf(stderr,"\tBuildAdHocNOperator::Unable to allocate memory for Operator at (%d,%d,%d)...exit\n",i,j,k); exit(1); } iPtr=NPSkx(i,j,k); CpyIVal2IVal(TmpX,iPtr,ElemMax); // Fügt die neue Liste in die 3D Struktur an MyNOperator.AddInteger(ElemMax,iPtr); // Fügt die neue Liste in die Bibliothek ein } else { NPSkx(i,j,k)=iPtr; // Liste gabs schonmal, also Adresse aus der Bibliothek übernehmen }
Ich kann mir vorstellen, daß ich die Adresse von NPSkx(i,j,k) auch noch in der Bibliothek aufnehmen muß, damit ich alle Adresse die auf das eine Element zeigen auf NULL setze, so daß sie von
if (Pointer!=NULL) { free(Pointer); Pointer=NULL; }
richtig erkannt werden... ich glaub so langsam hab ich es begriffen... oder lieg ich total daneben ?
Winn
-
Winn schrieb:
Das hat bei mir direkt zu Abbrüchen geführt... g++ meckert direkt, wenn free mehrmals auf NULL gemacht wird und bricht direkt mit dieser Fehlermeldung ab.
Nee, dann ist aber irgendwas anderes falsch (oder deine libs sind kaputt). Der gcc meckert jedenfalls bestimmt nicht.
-
@DrGreenthumb::Hast Recht ! Der Fehler liegt nicht daran, daß ein free auf ein NULL gemacht wurde... habs quasi nachgeschaut. Bin allerdings jetzt noch ratloser als vorher...