Печать текста вызывает утечку памяти - PullRequest
3 голосов
/ 19 мая 2019

Я хочу напечатать информацию о здоровье на моем экране для игры с использованием SDL TTF, но у меня утечка памяти.

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

Обычно вы должны освободить textSurface после запуска SDL_RenderCopy, но даже после этого он все равно не работает.

(я протестировал оставшуюся часть кода и обнаружил, что утечка памяти возникает только после использования renderHealth, поэтому я уверен на 100%, что это вызывает проблему.)

SDLText.h:

class SDLText {

    SDL_Surface* textSurface;
    SDL_Texture* text;
    TTF_Font * font;
...
}

SDLText.cpp:

void SDLText::renderHealth( int health) {

    font = TTF_OpenFont("fonts/OpenSans-Regular.ttf", 80);
    if (font == NULL) {
        printf("font error");
    }

    std::string score_text = "health: " + std::to_string(health);
    SDL_Color textColor = {255, 255, 255, 0};
    textSurface = TTF_RenderText_Solid(font, score_text.c_str(), textColor);
    text = SDL_CreateTextureFromSurface(gRenderer, textSurface);


    SDL_Rect Message_rect; //create a rect
    Message_rect.x = 120;  //controls the rect's x coordinate
    Message_rect.y = 5; // controls the rect's y coordinte
    Message_rect.w = 100; // controls the width of the rect
    Message_rect.h = 20; // controls the height of the rect

    SDL_RenderCopy(gRenderer, text, NULL, &Message_rect);

    SDL_FreeSurface(textSurface);
    SDL_DestroyTexture(text);

}

Может кто-нибудь сказать мне, что я не вижу / отсутствует?

РЕШЕНИЕ: После добавления TTF_CloseFont(font); в конце моя проблема была решена.

1 Ответ

3 голосов
/ 19 мая 2019

шрифт открыт, но никогда не закрывается. Используйте TTF_CloseFont , чтобы освободить память, используемую font.

Кроме того, вы должны избегать открывать шрифт каждый шрифт каждый раз, когда вы хотите отрендерить.

...