freigabe von reseviertem Speicher
-
guten morgen,
gibt es eine Möglichkeit zum überprüfen, ob der von mir resevierte Speicher korrekt freigegeben wurde. Versuche nach Möglichkeit die resevierung und freigeben im Auge zu behalten. Beim größerm Projekt kann ich auch einmal etwas übersehen. Speicher wird und muß in Unit's deklariert werden, ist vom Type vector(AnsiString, int)
Gruß Siegfried
-
Hallo
bei einem vector(AnsiString, int) must du gar nichts selber freigeben, das wird alles automatisch freigegeben, wenn der Gültigkeitsbereich des vectors verlassen wird.
Wenn du aber meinst, das du einen Pointer auf den vector hast, kannst du als einfachsten einen std::auto_ptr darauf verwenden, der dann ebenfalls beim ende der Gültigkeit den vector wieder löscht.
Überprüfen kannst du solche Speicherlecks imo mit CodeGuard, oder indem du new und delete überschreibst.
bis bald
akari
-
Hallo,
hier ein Ausschnitt meiner Code.Deklariere *.cpp std::vector<vector<vector<AnsiString> > > vvvasMemoryAktion; Deklariere *.h extern std::vector<vector<vector<AnsiString> > > vvvasMemoryAktion;..................... erstellen
// //---> dreifach Vector erstellen vvvasMemoryAktion.resize(iDbGruppen); // //---> n Tabelle/n in Vector/en speichern vvvasMemoryAktion[iPath].resize(iSatzAnzahl); // //---> n Fields in Vector/en speichern vvvasMemoryAktion[iPath][iSatz].resize(iFieldsAnzahl); // //---> Fields speichern vvvasMemoryAktion[iPath][iSatz][iFields] = " XYZ ";..................... freigeben iSize = vvvasMemoryAktion.size(); if (iSize > 0) { // iSize1 > 0 for (int i2=0; i2<iSize; i2++) { // i2=0; i2<iSize; i2++ iSize1 = vvvasMemoryAktion[i2].size(); // if (iSize1 > 0) { // iSize2 > 0 for (int i3=0; i3<iSize1; i3++) { // i3=0; i3<iSize1; i3++ vvvasMemoryAktion[i2][i3].clear(); } // i3=0; i3<iSize2; i3++ } // iSize1 > 0 vvvasMemoryAktion[i2].clear(); } // i2=0; i2<iSize; i2++ } // iSize > 0 vvvasMemoryAktion.clear();Arbeite schon mehrere Monate damit Funktionsmäßig damit keine Probleme.
wenn dieses verfahren nicht korrekt ist, wäre ich über Info's sehr dankbar.
Ich möchte die Gewißheit habe, das der resevierte Speicher wieder beim beenden des Programms wieder freigegeben wird. Alles ist in einer Unit erstellt. Das resevieren erfolgt von der ersten Form(Show) und das freigeben von der ersten Form(Close) aus. Noch ne Frage, muß ich auch die int iPath,iSatz,iFields freigeben ?
Gruß Siegfried
-
Das Verfahren ist technisch korrekt, aber praktisch überflüssig - der Vector-Destruktor zieht diese Schleifenkonstruktion schon selber durch, da brauchst du nicht manuell aufräumen.
(selber freigeben mußt du nur den Speicher, den du explizit über new oder malloc() angefordert hast)
-
hallo, guten morgen
werde die Zeilen im Auge behalten, sodas kein Problem auftritt. CodeGuard ist bei mir aktiv.
danke an alle
Gruß Siegfried
