GDI+::Image Problem



  • Hallo!

    Ich habe mir eine eigene kleine ImageList gemacht und wollte für die Images eigentlich ein Array des Typs Gdiplus::Image nehmen. Nun klappt das aber irgendwie nicht.

    Folgender Code zum Zeichnen funktioniert:

    void ImageList::Draw(::HDC &hDC, const ::POINT &Point)
    {
        Gdiplus::Image Image(L"Test.png");
        Gdiplus::Graphics Graphics(hDC);
    
        Graphics.DrawImage(&Image, Point.x, Point.y);
    }
    

    Wenn nun aber die Klasse einen privaten Member des Type Gdiplus::Image *m_pImage enthält und ich ich die Draw Methode wie folgt abändere. Kann ich später im Destruktor den Zeiger nich mehr Löschen. Ich erhalte eine "Zugriffsverletzung an Position..." (beim delete Aufruf des Zeigers);

    void ImageList::Draw(::HDC &hDC, const ::POINT &Point)
    {
        this->m_pImage = new Gdiplus::Image(L"Test.png");
        Gdiplus::Graphics Graphics(hDC);
    
        Graphics.DrawImage(this->m_pImage, Point.x, Point.y);
    }
    

    Könnte mir jemand erkären woran das liegt?



  • Es ist sinnfrei das Bild in der Zeichenmethode zu laden. Davon abgesehen solltest du vllt mal debuggen und gucken wo du dir den Bereich auf den der Zeiger zeigt schrottest. Und beim freigeben vorher auch mal gucken ob denn der Zeiger existiert ...hmm obwohl letzters ist unnötig, da laut std. auch löschen eines NULL-Zeigers erlaubt ist.



  • (D)Evil schrieb:

    Es ist sinnfrei das Bild in der Zeichenmethode zu laden. Davon abgesehen solltest du vllt mal debuggen und gucken wo du dir den Bereich auf den der Zeiger zeigt schrottest.

    Da gebe ich dir Recht, aber da es anders irgenwie überhaupt nicht funktioniert...
    Zeigeradressen vor Aufruf von Graphics.DrawImage und hinterher sind gleich. Der Fehler tritt direkt beim delete Aufruf

    delete this->m_pImage;
    

    auf.

    (D)Evil schrieb:

    Und beim freigeben vorher auch mal gucken ob denn der Zeiger existiert ...hmm obwohl letzters ist unnötig, da laut std. auch löschen eines NULL-Zeigers erlaubt ist.

    Ja, ich prüfe IMMER. Desweiteren nutze ich NIE NULL für "leere" Zeiger sondern 0.



  • Ja, ich prüfe IMMER. Desweiteren nutze ich NIE NULL für "leere" Zeiger sondern 0.

    ... ist ja auch in dem Fall gleich 😉

    Zeigeradressen vor Aufruf von Graphics.DrawImage und hinterher sind gleich. Der Fehler tritt direkt beim delete Aufruf

    Hmm nein ich meinte eher du solltest mal dein Programm durchsteppen und immer gucken was dein Zeiger für nen Wert hat. Vllt schleicht sich irgendwo nen Fehler ein ...



  • (D)Evil schrieb:

    ... ist ja auch in dem Fall gleich 😉

    Schon klar. Schließlich sollte es ja

    #define NULL 0;
    

    heißen. Jedoch hatt e ich schon Probleme unter VS6 Windows XP, mit NULL und 0. Null ist eben nicht gleich Null. Desweiteren halte ich mich an den Hinweis von Herrn Stroustrup stets 0 zu nutzen.

    (D)Evil schrieb:

    Hmm nein ich meinte eher du solltest mal dein Programm durchsteppen und immer gucken was dein Zeiger für nen Wert hat. Vllt schleicht sich irgendwo nen Fehler ein ...

    Ja, werde ich wohl noch einmal probieren.


Anmelden zum Antworten