SDL Speicherverwaltung



  • Hab eine Frage zu folgendem Code. Bei jedem Schleifen durchlauf wird mit GetKeyState immer wieder eine neue Adresse an Uint8 keys übergeben, doch was passiert mit den alten Adressen? Verschwinden die einfach? Kommen Speicherlecks? Ist der Code überhaupt in Ordnung?
    (betreffend Stelle is markiert)

    #include <windows.h>
    #include <iostream>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include <string>
    using namespace std;
    
    //Global
    SDL_Surface *screen = NULL;
    const short X = 640;
    const short Y = 480;
    const short C = 32;
    
    //Functions
    bool ApplySurface(short x, short y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *frames = NULL);
    
    int main(int argc, char *args[])
    {
    
        AllocConsole();
        freopen("CON", "w", stdout);
        freopen("CON", "w", stderr);
    
        //Lokal
        SDL_Event event;
        bool exit = false;
        TTF_Font *font = NULL;
        SDL_Color textColor = {255,255,255};
        SDL_Surface *text_left = NULL;
        SDL_Surface *text_right = NULL;
        SDL_Surface *text_up = NULL;
        SDL_Surface *text_down = NULL;
        Uint8 *keys = SDL_GetKeyState (NULL); //keys Zeiger
        bool pressed = false;
    
        //Grafik
        if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
        {
            return 1;
        }
    
        screen = SDL_SetVideoMode(X,Y,C,SDL_SWSURFACE);  //Fenster
    
        //Font
        if(TTF_Init() == -1)
        {
            return 1;
        }
    
        font = TTF_OpenFont("arial.ttf",22);
        text_left = TTF_RenderText_Solid(font,"LEFT",textColor);
        text_right = TTF_RenderText_Solid(font,"RIGHT",textColor);
        text_up = TTF_RenderText_Solid(font,"UP",textColor);
        text_down = TTF_RenderText_Solid(font,"DOWN",textColor);
    
        while(!exit)
        {
    
            while(SDL_PollEvent(&event))
            {
                switch(event.type)
                {
                    case SDL_QUIT:
                    exit = true;
                    break;
                }
    
                    keys = SDL_GetKeyState(NULL); //Wer sorgt hier für die Speicherverwaltung, löschen von keys?
                                                  //is dass n Fehler?
                    SDL_FillRect(screen, NULL, 0x00);
                    if(keys[SDLK_LEFT])
                    {
                        ApplySurface(10,200,text_left,screen);
                    }
                    if(keys[SDLK_RIGHT])
                    {
                        ApplySurface(200,200,text_right,screen);
                    }
                    if(keys[SDLK_UP])
                    {
                        ApplySurface(120,160,text_up,screen);
                    }
                    if(keys[SDLK_DOWN])
                    {
                        ApplySurface(100,200,text_down,screen);
                    }
            }
    
            //Buffer
            if(SDL_Flip(screen) == -1)
            {
                return 1;
            }
        }
    
        TTF_CloseFont(font);
        TTF_Quit();
    
        SDL_FreeSurface(text_left);
        SDL_FreeSurface(text_right);
        SDL_FreeSurface(text_up);
        SDL_FreeSurface(text_down);
    
        SDL_Quit();
    
        return 0;
    }
    
    bool ApplySurface(short x, short y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *frames)
    {
        SDL_Rect rect;
        rect.x = x;
        rect.y = y;
        if (!SDL_BlitSurface(source, frames, destination, &rect))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    

    MfG
    Stromberg

    PS: Igrendwie bilde ich mir ein den gleichen Thread heute morgen um 7 Uhr, kurz vor der Schule schon mal ins Forum gestellt zu haben. Hab ihn aber nicht gefunden, wahrscheinlich war ich da noch bissel verpennt...ka. Wenn der jetzt wirklich irgendwo sein sollte, dann entschuldige ich mich schon mal im Voraus für dass doppelte reinstellen.
    Obwohl ich mir irgendwie zu 90% sicher bin dass ich n reingestellt habe. Oder ich hab dann n Browser geschlossen ohne n abzuschicken. Bin echt grad verwirrt 🙂



  • Es kommt zwar auf die konkrete Implementierung von sdl an. Aber idr ist es so, dass SDL_GetKeyState() nur einen Zeiger auf ein statisches Array zurückgibt.
    d.h. insbesondere auch dass das SDL_GetKeyState() am Anfang ausreicht und keiner Speicher freigeben muss.

    Aber du solltest die SDL funktionen nur dann aufrufen wenn du SDL bereits initialisiert hast.



  • Ich habe keine Ahnung von SDL, aber es hat mich ca. 5 Minuten gekostet,
    herauszufinden, was SDL_GetKeyState() macht und wie es implementiert ist(!).

    GIYF



  • Und wieviel Schleifen durchläufe wären dann mit diesem statischen Array möglich?

    MfG
    Stromberg



  • Stromberg schrieb:

    Und wieviel Schleifen durchläufe wären dann mit diesem statischen Array möglich?

    12341235356123457668252345235

    Vielleicht auch noch mehr.
    Was sagt dir die Doku zu SDL_GetKeyState() ?


Anmelden zum Antworten