Beginner: aufräumen!
-
Ich habe die Klasse a mit dem Member
Gdiplus::Image* m_pImage;m_pImage wird in der Klasse ggf. durch new initialisiert.
ich will im Destruktor den Speicher - nur wenn er belegt wurde - wieder freigeben.
if(m_pImage) delete m_pImage; if(m_pImage != NULL) delete m_pImage;klappen nicht, hier bekomme ich wenn m_pImage nicht initialisiert wurde einen NullPointer. Wie dann? Um try-catch wollte ich an sich herumkommen.
-
Wenn du den Pointer nicht explizit mit einem Wert versiehst, hat er einen willkürlichen Anfangswert - da kann deine Sicherheitsabfrage überhaupt nichts abfangen. Die beste Lösung ist es deshalb, den Pointer im Ctor definiert zu belegen:
class test { public: test() : m_data(NULL) {} //Vorbelegung mit NULL test(int ct) : m_data(new int[ct]) {} //definierter Anfangswert ~test() { if(m_data)delete[] m_data; } private: int* m_data; }(wichtig ist hier, daß JEDER Konstruktor dem Pointer einen Wert gibt - entweder ein durch new erzeugtes Objekt oder NULL)
PS: Das Beispiel dient nur der Anschauung - und ist nicht praktisch einsetzbar

-
Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Muss ich mehrere Variablen durch Kommata trennen?
und ist das möglich und richtig (presPathName übergeben):
PicFrame::PicFrame(LPCSTR presPathName) : m_pImage(NULL), m_pOriginalImage(NULL), m_contextTime(0), m_timeCode(0), m_PathName(presPathName){}(der Compiler akzeptiert es) ?
Vielen Dank (mal wieder, ich backe Dir mal einen Kuchen glaube ich
)
-
DrOetker schrieb:
Muss ich mehrere Variablen durch Kommata trennen?
und ist das möglich und richtig (presPathName übergeben):
PicFrame::PicFrame(LPCSTR presPathName) : m_pImage(NULL), m_pOriginalImage(NULL), m_contextTime(0), m_timeCode(0), m_PathName(presPathName){}(der Compiler akzeptiert es) ?
ja
-
DrOetker schrieb:
Ich habe die Klasse a mit dem Member
Gdiplus::Image* m_pImage;m_pImage wird in der Klasse ggf. durch new initialisiert.
überlege erstmal, ob das so auch perfekt ist. ist das sinnvoll so, oder ist es besser, wenn das p_Image immer vom konstruktor gebaut wird?
if(m_pImage) delete m_pImage;nur
delete m_pImage;reicht. irgendwie wurde dummerweise festgelegt, daß delete 0; erlaubt ist und keine auswirkungen hat.