Speicherleck wegen verlorenem Pointer - Wie umgehen?
-
schwerminator schrieb:
Ich nehme alles zurück und behaupte das Gegenteil! Wenn ich den delete in den Destruktor schreibe, funktionierts anstandslos.
Danke!
PS: Warum meckert der Compiler hier über die Tilde? Kann man nicht von Destruktoren erben?
MyFrame::~MyFrame() : ~wxFrame(){ delete seaTalkPtr; }man kann nur von klassen erben.
destruktoren aller basisklassen werden automatisch aufgerufen, wenn sie virtual deklariert sind.
-
Danke!
-
Shade Of Mine schrieb:
Dravere schrieb:
Foo& operator =(Foo const& foo) { m_p = new int(*foo.m_p); }
rofl, geil ... das ist natürlich Unsinn

Foo& operator =(Foo const& foo) { *m_p = *foo.m_p; return *this; }Nur zur Rettung meiner Ehre ... *dum di dum*
Hab das wohl ein wenig zu schnell hingeworfen ...@asc,
Verwende fürnewSachen so gut wie nie die Initialisierungsliste. Ist mir zu heiss, wenn dort eine Exception fliegt.Grüssli
-
schwerminator schrieb:
Soll ichs dennoch mal beim Destruktor versuchen (ich wüsste jetzt nicht, wo da der Mehrwert wäre)?
Grundsätzlich ist es üblich den Destruktor, und nichts anderes für das aufräumen zu verwenden. Und wenn du dir nicht sicher bist, könntest du Alternativ auch Smartpointer verwenden (z.B. boost::scoped_ptr, boost::shared_ptr, std::tr1::shared_ptr...), und dir das delete von deiner Stelle aus schenken.
-
Dravere schrieb:
@asc,
Verwende fürnewSachen so gut wie nie die Initialisierungsliste. Ist mir zu heiss, wenn dort eine Exception fliegt.Ich verwende grundsätzlich auf Grund der Exceptionbehandlung die Initialisierungsliste und Smartpointer (nicht zwangsläufig den "teuren" shared_ptr, aber eigentlich inzwischen immer einen geeigneten).
-
kyle reese schrieb:
destruktoren aller basisklassen werden automatisch aufgerufen, wenn sie virtual deklariert sind.
Auch wenn sie nicht virtuell sind.
-
Dravere schrieb:
Foo& operator =(Foo const& foo) { *m_p = *foo.m_p; return *this; }Nur zur Rettung meiner Ehre ... *dum di dum*
Das ist immer noch falsch.
-
Dravere schrieb:
Foo& operator =(Foo const& foo) { *m_p = *foo.m_p; return *this; }Nur zur Rettung meiner Ehre ... *dum di dum*
this->m_p könnte nicht initialisiert sein, und Foo::m_p ist private.
-
~terraNova schrieb:
Foo::m_p ist private.
Inwieweit hindert diese Tatsache Foo:: (!) operator= daran, auf m_p zuzugreifen?
-
~john schrieb:
Dravere schrieb:
Foo& operator =(Foo const& foo) { *m_p = *foo.m_p; return *this; }Nur zur Rettung meiner Ehre ... *dum di dum*
Das ist immer noch falsch.
Aha?
Was ist daran falsch?
-
Edit: Korrektur, du kopierst ja nicht die Zeiger, sondern verwendest die Zuweisung der Objekte.
-
this->m_p könnte nicht initialisiert
Das kann auch nicht der Fall sein. Da hätte er bereits vorher (im ctor) ein Problem bekommen.