new und delete (Resource leak)



  • hallo

    kann mir jemand auf die sprünge helfen?
    ich komme mit dem new und delete nicht klar.

    ich bekomme vom codeguard immer ein resource leak angezeigt.

    "Objekt: StandortData::AddVZ() wird nicht mehr gelöscht."

    was mache ich falsch?

    gruß mario

    anbei ein kleines beispiel:

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "ClassVerkehrszeichen.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    StandortData* pData;  // Zeiger auf die Datenverwaltungsinstanz
    
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     pData = new StandortData ;
     pData->AddVZ();
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     pData->ClearAll();
     delete pData;
    
    }
    //---------------------------------------------------------------------------
    
    // ClassVerkehrszeichen.cpp
    
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "ClassVerkehrszeichen.h"
    
    //---------------------------------------------------------------------------
    // Konstruktor der VZInfo-Struktur (Schild)
    //---------------------------------------------------------------------------
     VZInfo::VZInfo()
     {
      sgNummer  = "Leer";  //IVZ-Nummer (Offizielle Nummer der IVZ)
      sgBild    = "Leer";  //Pfad+Name des Bildes
      igGroesse = 0;       //Größe des Verkehrszeichens
      igFolie   = 0;       //Folien-Typ
      igStaerke = 0;       //Staerke des Verkehrszeichens
      igBauart  = 0;       //1 = Flachform; 2 = Alform; 3 = Rundform
      sgBesonderheit = ""; //Besonderheiten / Bemerkungen
     };
    
    //---------------------------------------------------------------------------
    // Konstruktor der KBE-Klasse (Komplette Kleinbeschilderung am Standort)
    //---------------------------------------------------------------------------
     StandortData::StandortData()
     {
      pVZ = new TList;           // Zeigerliste für Verkehrszeichen erzeugen
      bgDataChanged = false;     // "geändert"-Flag
     }
    
    //---------------------------------------------------------------------------
    // Destruktor der EKB-Klasse (Komplette Kleinbeschilderung am Standort)
    //---------------------------------------------------------------------------
     StandortData::~StandortData()
     {
       if (pVZ != NULL)
       {
         pVZ -> Clear();
         delete pVZ;
         pVZ = NULL;
       }
     }
    
    //---------------------------------------------------------------------------
    // Alle Inhalte löschen
    //---------------------------------------------------------------------------
    void StandortData::ClearAll()
     {
       pVZ -> Clear();
       bgDataChanged = true;
     }
    
    //---------------------------------------------------------------------------
    // Hinzufügen eines neuen VZ-Datensatzes
    //---------------------------------------------------------------------------
    void StandortData::AddVZ()
     {
       pVZ -> Add(new VZInfo);
       bgDataChanged = true;
     }
    
    //---------------------------------------------------------------------------
    // Löschen eines VZ-Datensatzes
    //---------------------------------------------------------------------------
    bool StandortData::DelVZ(int ilIndex)
     {
       if(ilIndex >= 0 && ilIndex < pVZ -> Count)
       {
         pVZ -> Delete(ilIndex);
         pVZ -> Capacity = pVZ -> Count;
         bgDataChanged = true;
         return true;
       }
       else return false;
     }
    
    //---------------------------------------------------------------------------
    // Gibt die Anzahl der VZ zurück
    //---------------------------------------------------------------------------
    int StandortData::GetVZCount()
     {
       return pVZ -> Count;
     }
    
    //---------------------------------------------------------------------------
    // Gibt "geändert"-Flag zurück
    //---------------------------------------------------------------------------
    bool StandortData::Changed()
    {
       return bgDataChanged;
    }
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    
    // ClassVerkehrszeichen.h
    
    //---------------------------------------------------------------------------
    #ifndef ClassVerkehrszeichenH
    #define ClassVerkehrszeichenH
    
    //---------------------------------------------------------------------------
    // Struktur für die Daten eines VZ
    struct VZInfo
    {
      VZInfo();                  // Konstruktor
      AnsiString sgNummer;       // IVZ-Nummer (Offizielle Nummer der IVZ)
      AnsiString sgBild;         // Pfad+Name des Bildes
      int igGroesse;             // Größe des Verkehrszeichens
      int igFolie;               //Folien-Typ
      int igStaerke;             //Staerke des Verkehrszeichens
      int igBauart;              //1 = Flachform; 2 = Alform; 3 = Rundform
      AnsiString sgBesonderheit; //Besonderheiten / Bemerkungen
    };
    
    //---------------------------------------------------------------------------
    // KBE-Klasse (Komplette Kleinbeschilderung am Standort)
    //---------------------------------------------------------------------------
    class StandortData
    {
      private:
    
        //Liste der Zeiger auf die StandortData-Instanzen:
        TList * pVZ;
        bool bgDataChanged;   // Flag "Daten geändert"
    
      public:
    
        StandortData();                                     // Konstruktor
        ~StandortData();                                    // Destruktor
    
        //Allgemeine Definition
        void ClearAll();
    
        // Definitionen für Verkehrszeichen
        void AddVZ();
        bool DelVZ(int ilIndex);
    
        int GetVZCount();
    
        bool Changed();
    };
    
    //---------------------------------------------------------------------------
    #endif
    


  • Du machst

    pVZ -> Clear();
    

    und löschst damit die Zeiger zu den Elementen, ohne jedoch die einzelnen Elemente selbst zu löschen.



  • hallo Geo,

    ich habe folgende änderungen gemacht:

    //---------------------------------------------------------------------------
    // Destruktor der EKB-Klasse (Komplette Kleinbeschilderung am Standort)
    //---------------------------------------------------------------------------
     StandortData::~StandortData()
     {
       if (pVZ != NULL)
       {
         //pVZ -> Clear();
         delete pVZ;
         pVZ = NULL;
       }
     }
    
    void StandortData::ClearAll()
     {
       while (pVZ -> Count >0)
           DelVZ(pVZ -> Count -1)
    
       //pVZ -> Clear();
       bgDataChanged = true;
     }
    

    aber es klappt immer noch nicht. 😕

    würdest du mein beispiel so korregieren das es richtig ist?

    vielen dank und gruß mario



  • Du löschst immernoch nur den Zeiger auf die Objekte, nicht die Objekte selbst. Sieh dir doch einfach das Beispiel in der Hilfe zu TList::Items an.



  • danke für den hinweis.

    ich habe das problem gelöst.

    // ClassVerkehrszeichen.cpp
    
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "ClassVerkehrszeichen.h"
    
    //---------------------------------------------------------------------------
    // Konstruktor der VZInfo-Struktur (Schild)
    //---------------------------------------------------------------------------
     VZInfo::VZInfo()
     {
      sgNummer  = "Leer";  //IVZ-Nummer (Offizielle Nummer der IVZ)
      sgBild    = "Leer";  //Pfad+Name des Bildes
      igGroesse = 0;       //Größe des Verkehrszeichens
      igFolie   = 0;       //Folien-Typ
      igStaerke = 0;       //Staerke des Verkehrszeichens
      igBauart  = 0;       //1 = Flachform; 2 = Alform; 3 = Rundform
      sgBesonderheit = ""; //Besonderheiten / Bemerkungen
     };
    
    typedef VZInfo* TVZInfo;
    
    //---------------------------------------------------------------------------
    // Konstruktor der EB-Klasse (Komplette Kleinbeschilderung am Standort)
    //---------------------------------------------------------------------------
     StandortData::StandortData()
     {
      pVZ = new TList;           // Zeigerliste für Verkehrszeichen erzeugen
      bgDataChanged = false;     // "geändert"-Flag
     }
    
    //---------------------------------------------------------------------------
    // Destruktor der EKB-Klasse (Komplette Kleinbeschilderung am Standort)
    //---------------------------------------------------------------------------
     StandortData::~StandortData()
     {
       if (pVZ != NULL)
       {
         ClearAll();
         delete pVZ;
         pVZ = NULL;
       }
     }
    
    //---------------------------------------------------------------------------
    // Alle Inhalte löschen
    //---------------------------------------------------------------------------
    void StandortData::ClearAll()
     {
    
       // Bereinigung - Speicher wieder freigeben
       while ( pVZ -> Count > 0)
          DelVZ( pVZ -> Count -1);
    
       bgDataChanged = true;
     }
    
    //---------------------------------------------------------------------------
    // Hinzufügen eines neuen VZ-Datensatzes
    //---------------------------------------------------------------------------
    void StandortData::AddVZ()
     {
       pVZ -> Add(new VZInfo);
       bgDataChanged = true;
     }
    
    //---------------------------------------------------------------------------
    // Löschen eines VZ-Datensatzes
    //---------------------------------------------------------------------------
    bool StandortData::DelVZ(int ilIndex)
     {
       if(ilIndex >= 0 && ilIndex < pVZ -> Count)
       {
         TVZInfo AStruct;
    
         AStruct = (TVZInfo) pVZ -> Items(ilIndex);
         delete AStruct; 
    
         pVZ -> Delete(ilIndex);
         pVZ -> Capacity = pVZ -> Count;
         bgDataChanged = true;
         return true;
       }
       else return false;
     }
    
    //---------------------------------------------------------------------------
    // Gibt die Anzahl der VZ zurück
    //---------------------------------------------------------------------------
    int StandortData::GetVZCount()
     {
       return pVZ -> Count;
     }
    
    //---------------------------------------------------------------------------
    // Gibt "geändert"-Flag zurück
    //---------------------------------------------------------------------------
    bool StandortData::Changed()
    {
       return bgDataChanged;
    }
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    

Anmelden zum Antworten