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.


Anmelden zum Antworten