【问题标题】:SDL memory leak with TTFSDL 内存泄漏与 TTF
【发布时间】:2013-07-09 09:43:40
【问题描述】:

我尝试使用 SDL 和 TTF 制作一个基本的文本绘图类 但是我得到了这个巨大的内存泄漏..即使我释放了表面:/

这是 textloader.cpp

void TextLoader::drawStringWithShadow(string str,SDL_Rect rct,SDL_Color clr,SDL_Surface *screen)
{
    SDL_Color black = {0,0,0};
    text = TTF_RenderText_Solid(font,str.c_str(),black);
    rct.x++;
    rct.y++;
    SDL_BlitSurface(text,NULL,screen,&rct);
    rct.x--;
    rct.y--;
    text = TTF_RenderText_Solid(font,str.c_str(),clr);
    SDL_BlitSurface(text,NULL,screen,&rct);
    SDL_FreeSurface(text);
}

和文本 loader.h

    #pragma once
#include"includes.h"
class TextLoader
{
public:
    TextLoader(const char *Font,int Size);
    ~TextLoader(void);
    void drawString(string str,SDL_Rect rct,SDL_Color clr,SDL_Surface *screen);
    void drawStringWithShadow(string str,SDL_Rect rct,SDL_Color clr,SDL_Surface *screen);
private:
    SDL_Surface *text;
    TTF_Font *font;
};

我从我的主循环中调用它

【问题讨论】:

  • 你能用 valgrind 或类似工具查明泄漏吗?它应该为您提供更多信息,而不仅仅是您有泄漏的事实。不过可能需要调试符号。
  • 我正在运行 Win8。 valgrind 支持 linux/unix.. 你能推荐我另一个程序吗?
  • 一些建议可以在here找到。

标签: c++ memory-leaks sdl truetype


【解决方案1】:

您调用了两次TTF_RenderText_Solid(),但您只释放了一次使用它创建的表面text。 在您的第二次通话中:

 text = TTF_RenderText_Solid(font,str.c_str(),clr);

您覆盖了指向前一个表面的指针,从而造成内存泄漏。你做SDL_FreeSurface()第二个表面,但不是第一个。

注意:TTF_RenderText_Solid 返回指向全新表面的指针。

【讨论】:

  • 我尝试在以下之后释放表面:SDL_BlitSurface(text,NULL,screen,&rct);但它无法正常工作,我需要释放哪些表面?
猜你喜欢
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2011-10-16
  • 2019-08-08
  • 2012-08-21
  • 2016-01-25
相关资源
最近更新 更多