Как стать автором
Обновить

Комментарии 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);

titleInscription(...) вызывается только два раза за программу, и больше не вызывается.

Прошу прощения, вы правы. Что-то я зациклился не на том, представляя, что функция вызывается в каждом кадре. Как-то даже не ловко, столько букв настрочил )))

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории