Yritän tässä opiskella C++:aa tekemällä 2D-peliä SDL:llä ja eteeni tuli tavallaan ongelma. Täällä putkankin SDL-oppaassa käsketään aina vapauttamaan SDL_Surfacet kun niitä ei enää tarvita. Mitä jos tekee funktion joka palauttaa SDL_Surfacen, sitähän ei voi vapauttaa jos sen haluaa returnata, ja returnin jälkeistä koodiahan ei suoriteta.
SDL_Surface *arvattuTeksti(const char *arvaus, const char *koko_teksti, TTF_Font *fontti) { SDL_Color valkonen = {255, 255, 255}; SDL_Color sininen = {80, 86, 145}; SDL_Surface *arv = TTF_RenderText_Blended(fontti, arvaus, sininen); SDL_Surface *koko = TTF_RenderText_Blended(fontti, koko_teksti, valkonen); SDL_Rect alue = {0, 0, arv->w, arv->h}; Uint32 musta = SDL_MapRGB(koko->format, 0, 0, 0); SDL_FillRect(koko, &alue, musta); piirraKuva(arv, koko, 0, 0); return koko; }
Niin, ja miksei näytön sisältöä sisältävää surfacea tarvitse vapauttaa?
SDL_Surface *naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_RESIZABLE|SDL_DOUBLEBUF);
...tai ainakaan putkan SDL-oppaassa ei tehdä näin.
Pinta täytyy siis tuhota siellä, mistä funktiota kutsutaan.
SDLSurface* teksti = arvattuTeksti(...); // ... jotain koodia ... SDL_FreeSurface(teksti);
Nyt muuten funktiossasi luot kaksi pintaa (arv ja koko), joista yksi pitäisi myös tuhota siellä, koska palautat vain toisen.
Pintojen vapauttamisessa on kyse siitä, että jos niitä ei vapauta, ne jäävät kaikki muistiin, jolloin lopulta muisti loppuu eikä ohjelma enää toimi. (Yleisistä harhaluuloista poiketen edes SDL_Quit ei tuhoa pintoja. Sen sijaan käyttöjärjestelmän toki pitäisi vapauttaa kaikki muisti sitten, kun ohjelma lopulta sammuu, mutta tässä vaiheessa asialla ei tietenkään ohjelman kannalta ole enää merkitystä.)
Näyttöpintaa ei vapauteta, koska SDL käsittelee sitä eri tavalla kuin muita pintoja. Esimerkiksi SDL_SetVideoModen kutsuminen uudestaan tuhoaa vanhan näyttöpinnan ja palauttaa uuden. Myös SDL_Quit tuhoaa näyttöpinnan.
Aivan. Tuo palautettava pinta "koko" jää muistiin tuon funktion suorittamisen jälkeen, koska se on vain pointteri muistissa olevaan dataan?
Aihe on jo aika vanha, joten et voi enää vastata siihen.