von TList belegter Speicher ist nicht frei zugeben.
-
hallo,
Ich hatte Problem mit dem Speicher. Anschaulich ist es abhängig vom TList. Ich habe verschiedene Möglichkeiten versucht mein TList immer nach der Nutzung freizugeben. Aber es funktioniert immer (Anschaulich). Vielleicht mache ich etwas falsch oder nicht schön?
hier sit mein Code:#include "FahrplanListeFkt.hpp" // --------------------------------------------------------------------------- TFahrPlanListeFkt::TFahrPlanListeFkt() { FL_V_ListeStart = NULL; // Start der dyn Liste FL_V_ListeEnde = NULL; // letztes Listenelement FL_V_ListeAkt = NULL; // aktuelles Listenelement FL_V_ElemAnz = 0; FL_Liste = new TList(); } // --------------------------------------------------------------------------- TFahrPlanListeFkt::~TFahrPlanListeFkt() { FL_LoescheListe(false); if (FL_Liste != NULL) { delete FL_Liste; FL_Liste =NULL; } } // --------------------------------------------------------------------------- // Loescht die dynamische Liste den mit den Adresseintraegen // --------------------------------------------------------------------------- void TFahrPlanListeFkt::FL_LoescheListe(bool listeLoeschen) { if (FL_Liste == NULL) return; for (int i = 0; i< FL_Liste->Count; i++ ) { g_D_FahrPlanDaten *Akt = ( g_D_FahrPlanDaten*) FL_Liste->Items[i] ; //FL_Liste->Remove(Akt); g_V_VerwFahrplan.VF_ModulPlanTagesEintrag_Test(*Akt,i,"_L") ; delete Akt; Akt = NULL; } FL_Liste->Clear(); if (listeLoeschen) { delete FL_Liste; FL_Liste = NULL; } } // --------------------------------------------------------------------------- // Liefert die Anzahl der Elemente in der Liste // --------------------------------------------------------------------------- int TFahrPlanListeFkt::FL_GetElemAnz() { if (FL_Liste != NULL) return(FL_Liste->Count ); else return 0; } int TFahrPlanListeFkt::FL_Append(g_D_FahrPlanDaten Daten) { g_D_FahrPlanDaten *Elem = NULL; int Result = -1; try { if (FL_Liste == NULL) { FL_Liste = new TList(); } Elem = new g_D_FahrPlanDaten; if (Elem) { Elem->StationId = Daten.StationId; Elem->Fahrt = Daten.Fahrt; Elem->Linie = Daten.Linie; Elem->Ziel = Daten.Ziel; Elem->Ueber = Daten.Ueber; Elem->AnkSoll = Daten.AnkSoll; Elem->AbfSoll = Daten.AbfSoll; Elem->AnkIst = Daten.AnkIst; FL_Liste->Add(Elem); Result = 0; } } catch (Exception &E) { Result = -2; g_V_LogFkt.L_Eintrag("!!! Exception: " + AnsiString(__FILE__) + " -> " + AnsiString(__FUNC__) + ", Text folgt:"); g_V_LogFkt.L_Eintrag(E.Message.c_str()); } return(Result); } int TFahrPlanListeFkt::FL_Insert(g_D_FahrPlanDaten Daten) { int Result = -1; try { if (FL_Liste == NULL) { FL_Liste = new TList(); } Result = FL_Append( Daten); } // try catch (Exception &E) { Result = -2; g_V_LogFkt.L_Eintrag("!!! Exception: " + AnsiString(__FILE__) + " -> " + AnsiString(__FUNC__) + ", Text folgt:"); g_V_LogFkt.L_Eintrag(E.Message.c_str()); } return(Result); } g_D_FahrPlanDaten *TFahrPlanListeFkt::FL_GetElem(int index) { g_D_FahrPlanDaten *akt = NULL; if (index < FL_Liste->Count ) akt = (g_D_FahrPlanDaten *) FL_Liste->Items[index]; return(akt); } TList * TFahrPlanListeFkt::FL_GetList() { return FL_Liste; } g_D_FahrPlanDaten *TFahrPlanListeFkt::FL_GetLastElem() { g_D_FahrPlanDaten *akt = NULL; if (FL_Liste->Count >0 ) akt = (g_D_FahrPlanDaten *) FL_Liste->Last(); return(akt); } g_D_FahrPlanDaten * TFahrPlanListeFkt::FL_GoNextElem(g_D_FahrPlanDaten Daten) { g_D_FahrPlanDaten *FL_V_ListeAkt = NULL; for (int i = 0; i < FL_Liste->Count; i++) { g_D_FahrPlanDaten *akt = (g_D_FahrPlanDaten *) FL_Liste->Items[i]; if ( akt->AbfSoll == Daten.AbfSoll && akt->Linie == Daten.Linie && akt->Ziel == Daten.Ziel && akt->Ueber == Daten.Ueber && akt->StationId == Daten.StationId ) { if ( i+1 < FL_Liste->Count) FL_V_ListeAkt = (g_D_FahrPlanDaten *) FL_Liste->Items[i+1]; break; } } return(FL_V_ListeAkt); } g_D_FahrPlanDaten * TFahrPlanListeFkt::FL_GoPrevElem(g_D_FahrPlanDaten Daten) { g_D_FahrPlanDaten *FL_V_ListeAkt = NULL; for (int i = 0; i < FL_Liste->Count; i++) { g_D_FahrPlanDaten *akt = (g_D_FahrPlanDaten *) FL_Liste->Items[i]; if ( akt->AbfSoll == Daten.AbfSoll && akt->Linie == Daten.Linie && akt->Ziel == Daten.Ziel && akt->Ueber == Daten.Ueber && akt->StationId == Daten.StationId ) { if ( i-1 >0) FL_V_ListeAkt = (g_D_FahrPlanDaten *) FL_Liste->Items[i-1]; break; } } return(FL_V_ListeAkt); } ich werde die Liste ständig auffüllen und leeren. ich denke manchmal, dass der Prozess zum Leeren der Liste nicht schnell genug wäre. ist das möglich? oder habe ich da Probelme? Danke für eure tipps. Marek
-
Einen Hinweis habe ich: etwa 90% deines Codes ist redundant. Schau dir an, wie TObjectList, std::vector<>, std::auto_ptr<> und Exceptions funktionieren, dann sparst du dir viele Umstände.