TTF_RenderText_Solid使我的ram增加到2GB并返回NULL

时间:2016-01-14 23:31:03

标签: c++ c pointers sdl

我在C / C ++上使用SDL库 我有这种方法在屏幕上写文字:

//string, pos.x and pos.y
void writeText(int x, int y, char *str)
{
   SDL_Surface* textSurface;
   SDL_Texture *mTexture;
   SDL_Color textColor = { 0XFF, 0XFF, 0XFF };
   SDL_Rect src, dst;
   SDL_Renderer* gRenderer = getRenderer();

   textSurface = TTF_RenderText_Solid(font, str, textColor);
   mTexture = SDL_CreateTextureFromSurface(gRenderer, textSurface);
   src.x = 0; dst.x = x;
   src.y = 0; dst.y = y;
   src.w = dst.w = textSurface->w;
   src.h = dst.h = textSurface->h;
   SDL_RenderCopy(gRenderer, mTexture, &src, &dst);

}

我在do-while内部的main函数中使用此方法来编写播放器SCORE。这样,使内存从20MB(没有这种方法)增加到2024MB(使用此方法),然后返回"读取访问冲突"。我认为问题是这个方法在每次do-while迭代中都会创建一个对象,并且内存会在没有控制的情况下增加。

如何绕过这个?

我是C指针的新手,我尝试过这样的方法来重复使用textSurface而不在每次迭代时创建一个新对象:

SDL_Surface textSurfaceCreate() {
    SDL_Surface textSurface;
    return textSurface;
}

在Main上,调用类似

的内容
SDL_Surface textSurface = textSurfaceCreate();

并且在do-while内部:

writeText(SDLSurface* textSurface, int x, int y, char *str);

但是当我编译时,Visual Studio给了我一些错误。

1 个答案:

答案 0 :(得分:2)

可以从Visual Studio中显示错误吗?

您实际上提供了自己的解决方案。如果您对原始代码块进行了这些更改,那么每次调用此函数时您都不会创建新的SDL_Texture和SDL_Surface(我认为每帧一次),那么您将无法体验到记忆增加。你可以简单地在你的函数之外设置你的表面和纹理,在其他地方并将它们传递给函数,例如:

SDL_Surface* textSurface = nullptr;
SDL_Texture* mTexture = nullptr;

void writeText(SDL_Surface* surface, SDL_Texture* texture, int x, int y, char *str)
{
   SDL_Color textColor = { 0XFF, 0XFF, 0XFF };
   SDL_Rect src, dst;
   SDL_Renderer* gRenderer = getRenderer();

   surface = TTF_RenderText_Solid(font, str, textColor);
   texture = SDL_CreateTextureFromSurface(gRenderer, surface);
   src.x = 0; dst.x = x;
   src.y = 0; dst.y = y;
   src.w = dst.w = surface->w;
   src.h = dst.h = surface->h;
   SDL_RenderCopy(gRenderer, texture, &src, &dst);
}

如果您不想这样做,那么您可以在绘制调用后创建并销毁此函数末尾的纹理和曲面。我相信该函数将类似于SDL_DestroySurface()和SDL_DestroyTexture()。