Speicherfehler bei Release() einer Palette



  • Hallo
    ich bin gerade dabei eine Klasse für eine DirectDrawPalette zu schreiben. Wenn ich diese Klasse auf dem Stack erzeuge, läuft das ganze ohne Fehlermeldungen etc. Wenn ich aber ein Objekt auf dem Heap erzeuge, bekomme ich beim abschließenden delete, bei dem die Palette releast wird, einen Fehler ala "Die Anweisung ... verweist auf Speicher in ... . Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden."
    Hier mal der Quelltext:

    //Header Datei
    class CPalette
    {
    public:
        CPalette():palette(256) {};
        CPalette(CDraw7Main& main, int flags = DDPCAPS_8BIT | DDPCAPS_ALLOW256 |
                                                DDPCAPS_INITIALIZE);
        CPalette(CDraw7Main& main, vector<PALETTEENTRY> pal, int flags = DDPCAPS_8BIT | 
                                                                         DDPCAPS_ALLOW256 |
                                                                         DDPCAPS_INITIALIZE);
        ~CPalette();
        vector<PALETTEENTRY> GetPalette() const {return palette;}
        void SetPalette (vector<PALETTEENTRY> pal);
    private:
        vector<PALETTEENTRY> palette;
        LPDIRECTDRAWPALETTE lpddpal;
    
    };
    
    // Cpp Datei
    CPalette::CPalette(CDraw7Main& main, int flags)
    {
        PALETTEENTRY temp;
        temp.peFlags = PC_NOCOLLAPSE;
        for (int i=0; i<256; i++)
        {
            temp.peBlue = 133;
            temp.peGreen = 122;
            temp.peRed = 100;
            palette.push_back(temp);
        }
    
        if (FAILED(main.GetDraw()->CreatePalette(flags,&palette.front(),&lpddpal,0)))
            throw "Fehler bei Palettenerstellung";
    }
    
    CPalette::CPalette(CDraw7Main& main, vector<PALETTEENTRY> pal, int flags)
    {
        SetPalette(pal);
        main.GetDraw()->CreatePalette(flags,&palette.front(),&lpddpal,0);
    }
    
    CPalette::~CPalette()
    {
        if (lpddpal)
        {   
            lpddpal->Release();
        }
    }
    
    void CPalette::SetPalette(vector<PALETTEENTRY> pal)
    {
    while (pal.size()>256)
        pal.pop_back();
    palette.clear();
    palette.assign(pal.begin(),pal.end());
    }
    
    // in WinMain
    CDraw7Main * Main;
    CPalette * Palette;
    try
    {
        Main = new CDraw7Main(hwnd,1024,768,8);
        Palette = new CPalette();
    }
    catch (char* Fehler)
    {
        MessageBox(0,Fehler,"Fehler",MB_OK);
    }
    catch (...)
    {
        MessageBox(0,"Fehler ohne konkrete Angabe","Fehler",MB_OK);
    }
    
    //...
    delete Palette;
    delete Main;
    

    Wenn ich das delete Palette auskommentiere (absichtlich ein Speicherleck verursache), kommt der Fehler nicht. Er muss also im Destruktor liegen. Nur weiß ich nicht wo...
    Ich hoffe ihr könnt mir helfen...



  • Hab den Fehler gefunden... Trotzdem danke...


Anmelden zum Antworten