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)