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.


Anmelden zum Antworten