打印文本会导致内存泄漏

时间:2019-05-19 13:51:02

标签: c++ memory-leaks sdl-ttf

我想在屏幕上使用SDL ttf为游戏打印健康信息,但出现内存泄漏。

游戏开始并可以运行一段时间(包含文本和全部内容),但几秒钟后它将停止。

通常,您应该在运行SDL_RenderCopy之后释放textSurface,但是即使这样做,它似乎仍然无法正常工作。

(我已经测试了其余的代码,发现使用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 个答案:

答案 0 :(得分:3)

字体已打开但从未关闭。使用TTF_CloseFont释放font使用的内存。

此外,您应该考虑避免每次要渲染时都打开每种字体的字体。