Klasse auf Heap freigeben
-
Hallo Leute,
ich hab folgendes "Problem".
Ich hab im Kontruktor von THEApp (MFCAnwendung) drei Klassen auf dem Heap instanziert. Den Pointer auf diese Objekte hab ich dann in globale Pointer kopiert. Nun möchte ich an einer andere Stelle den Heap wieder freigeben und die Klassen zerstören.
Habs mit delete pKlasse versucht. Hier wird der Destruktor der Klasse jedoch nicht aufgerufen. Wie kann ich das Objekt richtig zerstören? Also Heap freigeben und die Klasse Beenden? Kurzer Auszug aus dem Code:Oberste *pEins;
Mittlere *pZwei;
Unterste *pDrei;CKlassenTest2App::CKlassenTest2App()
{
Oberste *Eins = new Oberste;
Mittlere *Zwei = new Mittlere;
Unterste *Drei = new Unterste;
pEins = Eins;
pZwei= Zwei;
pDrei = Drei;
}BOOL CKlassenTest2App::InitInstance()
{
if (nResponse == IDOK)
{
delete pEins;
delete pZwei;
delete pDrei;
// TODO: Fügen Sie hier Code ein, um das Schließen des
// Dialogfelds über "OK" zu steuern
}
}
-
nimloth80_2 schrieb:
Habs mit delete pKlasse versucht. Hier wird der Destruktor der Klasse jedoch nicht aufgerufen.
Doch, wenn muss es an was anderen liegen.
Zudem Frage ich mich warum du die Zeiger nicht direkt zuweist, sondern über temporäre Variablen gehst (Ganz davon abgesehen das ich globale Variablen immer vermeiden würde, wenn es möglich ist). Zudem würde ich Zeiger (auch globale) immer mit NULL initialisieren.
-
Naja, ich wollte Anfangs irgendwo meine Klasse instanzieren.
Wenn ich das Global mache ist das in sofern schlecht, weil ich nicht genau weiss in welcher Reihenfolge die globalen Variablen angelegt werden (wenn ich das in mehreren Cpp's mache). Daher mach ich das lokal, da weiss ich genau wann das passiert. Der Globale Zeiger war sowieso schon null (hab ich geschaut :)).Ich habs nochmal geprüft. Der Destruktor wird mit delete doch aufgerufen. Jedoch ist das Programm warscheinlich schon soweit abgebaut, dass AfxMessageBox(_T(" Destruktor oberste")) nicht mehr funktioniert.
-
Trotzdem sind die Variablen Eins/Zwei/Drei nicht nötig, das kannst du auch direkt zuweisen.
-
Okay seh ich ein

-
Ich würde zudem die Initialisierungsliste im Konstruktor verwenden, statt Member für Member zuzuweisen.
// "C" ist nicht nötig als Klassenpräfix KlassenTest2App::KlassenTest2App() // "p" ist nicht nötig als Zeigerpräfix : Eins(new Oberste) , Zwei(new Mittlere) , Drei(new Unterste) { // Im Rumpf ist bereits alles initialisiert, nichts mehr zu tun. }