Dynam. Array mit Speicherleck?
-
Hallo,
ich habe ein Array mit 10 Zeilen. In jeder Zeile ist ein Liste mit verketteten Strings.
Ich befürchte, dass ich in meinem Prog ein Speicherleck habe. Ich verwende 2 x den Operator new. Dementsprechend würde ich natürlich gerne 2 x den Operator delete einsetzen.
Das klappt aber leider nicht, da das Prog an entsprechender Stelle (siehe 4) abstürzt.
Nur wenn ich (4) auskommentiere scheint es zu funktionieren. Deshalb vermute ich, dass ich hier ein Speicherleck habe.Ich verwende ein Schema ähnlich einem Beispiel aus einem Lehrbuch (2-dimensionale dyn. Arrays).
Im Lehrbuch wird aber ein Array vom Typ double arr[zeilen][spalten] dynamisch angelegt.Vielleicht kann jemand meinen Fehler erkennen. Sind mein Befürchtungen berechtigt?
Ich poste 'mal das Wichtigste:
int zeilen = 10; //Anzahl d Zeilen //(1) Lehrbuch: Zeiger auf Zeiger d Datentyps des Feldes erstellen TStringList **aStrListArr; //(2) Lehrbuch: mit new für jede Zeile ein Element des gewünschten Typs reservieren aStrListArr = new TStringList*[zeilen]; //(3) Lehrbuch: Platz für die Spaltenelemente reservieren (hier: jeweils 1 TStringList) for (int j=0; j<zeilen; j++) aStrListArr[j] = new TStringList; //erzeugt f jede Zeile ein TStringList //Daten im Feld ablegen u verarbeiten, als Bsp. hier extrem vereinfacht for (int i=0; i<zeilen; i++) aStrListArr[i]->Add("String" + IntToStr(i)); //bis hier klappt alles, wenn ich das schrittweise mit dem Debugger nachprüfe! //(4) Lehrbuch: in umgekehrter Reihenfolge die Elemente feigeben hier zuerst die Spaltenelemente //for (h=0; h<zeilen; h++) // delete [] aStrListArr[h]; //hier stürzt das Programm ab? //Lehrbuch (5): zuletzt das Zeigerfeld freigeben delete [] aStrListArr; aStrListArr = NULL; //wenn ich (4) auskommentiere funktioniert's so ohne Absturz
-
[cpp] aStrListArr[j] = new TStringList; //erzeugt f jede Zeile ein TStringList
// delete [] aStrListArr[h]; //hier stürzt das Programm ab?[/cpp]
Achte darauf, das ein new nur mit delete und ein new[] nur mit delete[] behandelt werden darf.
-
Hallo @Knuddlbaer
Knuddlbaer schrieb:
Achte darauf, das ein new nur mit delete und ein new[] nur mit delete[] behandelt werden darf.
Ähem , kannst Du das vielleicht so ausdrücken, dass ich was damit in meinem Beispiel anfangen kann?
-
Hallo Herr/Frau Administrator/in,
ich sehe gerade, dass ich hier versehentlich, nicht wie gewünscht im C++-Forum, sondern im C++/CLI mit.NET-Forum gelandet bin.Bitte deshalb vielmals um Entschuldigung und gleichzeitig um Transfer an gewünschte Stelle.
Vielen Dank.
-
thunderbol4 schrieb:
Hallo @Knuddlbaer
Knuddlbaer schrieb:
Achte darauf, das ein new nur mit delete und ein new[] nur mit delete[] behandelt werden darf.
Ähem , kannst Du das vielleicht so ausdrücken, dass ich was damit in meinem Beispiel anfangen kann?
Du erzeugst das Element mit new
aStrListArr[j] = new TStringList; //erzeugt f jede Zeile ein TStringList
und löschst es mit delete[]
delete [] aStrListArr[h]; //hier stürzt das Programm ab?
[/cpp]
-
Danke @Knuddlbaer,
ich denke ich hab's geschnallt (Tomaten auf den Augen, man wird halt älter!! )hier die Richtigstellung:
.. //(3) for (int j=0; j<zeilen; j++) aStrListArr[j] = new TStringList; .. //(4) for (int h=0; h<zeilen; h++) //so funktionierts delete aStrListArr[h]; //das delete [] war hier falsch! .. //(5)