Комментарии 7
В первом методе
SDL_Texture* titleInscription(..)
{
...
}
не нужно ли удалять SDL_Surface* image после конвертации его в текстуру?
(gdb) printf "%i\n",titleTime
1437434912
(gdb) printf "%i\n",groundTexture
No symbol "groundTexture" in current context.
(gdb) printf "%i\n",image
No symbol "image" in current context.
_________________________________
как видно из отладчика, локальные переменные внешней функции после использования автоматически уничтожаются
Вот только SDL_Surface* image -- это не локальная переменная, а указатель на область памяти, выделенный внутри функции TTF_RenderText_Solid.
И чтобы не было утечки памяти, необходимо не забывать вызывать метод SDL_FreeSurface(image).
Спасибо за ваше недоверие, image это локальная переменная, содержащая в себе указатель на структуру, а не на динамическую память. Ну и так как никакой динамической памяти не выделяется, то можно и не освобождать surface
Так, попробую с другого бока.
Посмотрите, вот у вас имеется строка:SDL_Surface* image = TTF_RenderText_Solid(timerFont,writeYourName,timerColor);
В ней вы создали локальную переменную, содержащую в себе указатель на структуру SDL_Surface
. Структура эта создана в куче (то есть, в области динамической памяти), а не на стеке. Если бы она была создана на стеке, то строка имела бы вид:SDL_Surface image = TTF_RenderText_Solid(timerFont,writeYourName,timerColor);
Когда функция titleInscription(...)
завершит своё выполнение, то локальная переменная, содержащая в себе указатель на струкруту SDL_Surface
уничтожится, а вот память с этой структурой, выделенная в динамической области памяти, никуда не денется.
А функция titleInscription(...)
вызывается на каждом кадре, выделяя память под стркутуру SDL_Surface
размером 200x50 пикселей, что должно занимать память не менее чем 200*50*3=30000 байт за кадр. А если кадров 60 в секунду, то в секунду утечка памяти на 30 килобайт. За час работы программы утекает не менее 105 мегабайт памяти только на выводе FPS на экран.
Чтобы этого безобразия не было, нужно в функции titleInscription(...)
после строки
SDL_Texture* groundTexture = SDL_CreateTextureFromSurface(gRenderer,image);
вызвать метод SDL_FreeSurface(image);
Уроки по SDL 2: Урок 14 Таймер и FPS