Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SDL] Rosnąca pamięć.

Ostatnio zmodyfikowano 2013-05-01 17:23
Autor Wiadomość
robul21
Temat założony przez niniejszego użytkownika
[SDL] Rosnąca pamięć.
» 2013-05-01 15:37:30
Witam

Mam problem z funkcją poniżej, cały czas rośnie mi pamięć i to w szybkim tempie, nie mogę znaleźć w którym miejscu.
Na razie ma być wyświetlany tylko jakby stoper, ale po niecałych dwóch minutach, brakuje już pamięci.


#include "chemia.h"

C/C++
void chema( SDL_Surface * ekran )
{
    bool wyjscie = false, wystartowac = false;
    SDL_Event zdarzenie;
    int mychaX, mychaY;
    SDL_Rect pole[ 5 ], naCzas[ 3 ];
    uzupelnijWspolrzedneCH( pole, naCzas );
    SDL_Surface * plansza = SDL_LoadBMP( "chemia.bmp" );
    SDL_Surface * start = SDL_LoadBMP( "start_chemia.bmp" );
    SDL_Surface * Pczas = NULL;
    SDL_Color kolor; //deklaracja koloru dla czcionki
    kolor.r = 0;
    kolor.g = 0;
    kolor.b = 0;
    TTF_Font * font = TTF_OpenFont( "banana.ttf", 60 );
    unsigned long long int * wczas, * wtemp, * wmin, * wsekDz, * wsek, czas = 0, temp = 0, min = 0, sekDz = 0, sek = 0;
    wczas = & czas;
    wtemp = & temp;
    wmin = & min;
    wsekDz = & sekDz;
    wsek = & sek;
    string Sczas; //zmienne które są nam potrzebne do wyświetlenia aktualnego wyniku
    ostringstream Oczas; //to też zmienna jak wyżej
   
   
   
    SDL_BlitSurface( plansza, NULL, ekran, NULL );
    SDL_BlitSurface( start, NULL, ekran, & pole[ 4 ] );
    SDL_Flip( ekran );
   
   
   
   
    while( !wyjscie ) //petla główna
    {
        while( SDL_PollEvent( & zdarzenie ) ) //petla odbsługująca zdarzenia
        {
            if( zdarzenie.type == SDL_QUIT )
            {
                wyjscie = true; //jak nacisnie krzyżyk to wychodzi do manu
            }
            if( zdarzenie.type == SDL_MOUSEMOTION )
            { //sprawdza czy mysz sie poruszyła i przypisuje współrzędne
                mychaX = zdarzenie.motion.x;
                mychaY = zdarzenie.motion.y;
               
               
            }
            if( zdarzenie.type == SDL_MOUSEBUTTONDOWN )
            { //sprawdza czy jest naciśnięty przycisk myszy
                if( zdarzenie.button.button == SDL_BUTTON_LEFT )
                {
                    if( mychaX >= pole[ 4 ].x && mychaX <= pole[ 4 ].x + pole[ 4 ].w
                    && mychaY >= pole[ 4 ].y && mychaY <= pole[ 4 ].y + pole[ 4 ].h )
                    {
                        if( wystartowac == false ) { * wczas = clock(); }
                        wystartowac = true;
                        SDL_Flip( ekran );
                       
                    }
                   
                    if( wystartowac )
                    {
                        SDL_BlitSurface( plansza, & pole[ 4 ], ekran, & pole[ 4 ] );
                        SDL_Flip( ekran );
                        //tutaj co zrobić już naciśnie już start
                       
                    }
                }
               
               
               
            }
        }
        if( wystartowac == true )
        {
            SDL_FreeSurface( ekran );
            SDL_BlitSurface( plansza, NULL, ekran, NULL );
            wyswietlCzas( wczas, wtemp, wmin, wsekDz, wsek, ekran, naCzas, Sczas, Oczas, plansza, kolor, font, Pczas );
        }
    }
    SDL_FreeSurface( plansza );
    SDL_FreeSurface( start );
    return;
}

void wyswietlCzas( unsigned long long int * czas, unsigned long long int * temp, unsigned long long int * min, unsigned long long int * sekDz, unsigned long long int * sek, SDL_Surface * ekran, SDL_Rect tutaj[ 3 ], string Sczas, ostringstream & Oczas, SDL_Surface * plansza, SDL_Color kolor, TTF_Font * font, SDL_Surface * Pczas )
{
    * temp = 0, * min = 0, * sekDz = 0, * sek = 0;
    SDL_BlitSurface( plansza, & tutaj[ 0 ], ekran, & tutaj[ 0 ] );
    SDL_BlitSurface( plansza, & tutaj[ 1 ], ekran, & tutaj[ 1 ] );
    SDL_BlitSurface( plansza, & tutaj[ 2 ], ekran, & tutaj[ 2 ] );
   
   
    * temp = clock() - * czas;
   
    Oczas.str( "" );
    * min = * temp / 60000;
    Oczas << * min;
    Sczas = Oczas.str();
    Pczas = TTF_RenderText_Solid( font, Sczas.c_str(), kolor );
    SDL_BlitSurface( Pczas, NULL, ekran, & tutaj[ 0 ] );
   
    Oczas.str( "" );
    * sekDz =((( * temp / 1000 ) -* min * 60 ) / 10 );
    Oczas << * sekDz;
    Sczas = Oczas.str();
    Pczas = TTF_RenderText_Solid( font, Sczas.c_str(), kolor );
    SDL_BlitSurface( Pczas, NULL, ekran, & tutaj[ 1 ] );
   
    Oczas.str( "" );
    * sek =( * temp / 1000 ) % 10;
    Oczas << * sek;
    Sczas = Oczas.str();
    Pczas = TTF_RenderText_Solid( font, Sczas.c_str(), kolor );
    SDL_BlitSurface( Pczas, NULL, ekran, & tutaj[ 2 ] );
   
    SDL_FreeSurface( Pczas );
   
   
    SDL_Flip( ekran );
    return;
   
}
P-81708
DejaVu
» 2013-05-01 17:02:58
Pewnie w pętli wczytujesz jakąś bitmapę i nie zwalniasz jej.
P-81719
robul21
Temat założony przez niniejszego użytkownika
» 2013-05-01 17:23:36
dobra wiem, gdzie jest problem.
W tej drugiej funkcji w linijkach
C/C++
...
Pczas = TTF_RenderText_Solid( font, Sczas.c_str(), kolor );
SDL_BlitSurface( Pczas, NULL, ekran, & tutaj[ 1 ] );
...

ale niby na koniec zwalniam przestrzeń "Pczas" więc czemu ta pamięć się nie zwalnia?

//edit

dobra problem rozwiązany, musiałem zwalniać "Pczas" przed każdą aktualizacją.
P-81724
« 1 »
  Strona 1 z 1