SDL_TTF Drawing int to string内存泄漏?
SDL_TTF Drawing int to string memory leak?
好的,所以我一直在尝试显示一个能够更新并反映在屏幕上的整数。 (e.x。显示鼠标位置的 x 和 y 坐标),它 运行 正是我想要的,但后来我打开了很好的 ol'task 管理器,看到我已经达到了大约 600mb 运行 7 分钟。当我注释掉我在屏幕上呈现的整数时(这样它们就不会绘制或更新)。该程序在 7 分钟后徘徊在 20mb 左右。我一直没有找到问题所在,谁能帮我找出我哪里出错了?谢谢
//TextMangager.h
#pragma once
#ifndef TEXTMANAGER_H
#define TEXTMANAGER_H
#include <SDL_ttf.h>
#include "graphicsManager.h"
#include <sstream>
struct textManager{
public:
textManager(){}
~textManager();
void SetText(std::string msg, int x, int y);
void draw();
void setFont(std::string filepath, int size);
void changeFontSize(int size);
int getWidth();
int getHeight();
void setColor(int r, int g, int b);
void intToString(Uint32 number, int x, int y);
private:
TTF_Font*font;
SDL_Texture*texture;
SDL_Rect dst;
SDL_Rect src;
SDL_Surface*surface;
SDL_Color color;
std::stringstream ss;
std::string text;
};
#endif // TEXTMANAGER_H
//TextManager.cpp的一部分
void textManager::intToString(Uint32 number, int x, int y)
{
ss << number;
text = ss.str().c_str();
surface = TTF_RenderText_Blended(font, text.c_str(), color);
if (surface == NULL)
cout << "surface is NULL \n" << SDL_GetError() << "\n";
texture = SDL_CreateTextureFromSurface(Gfx::Instance()->getRenderer(), surface);
SDL_FreeSurface(surface);
src.x = 0;
src.y = 0;
src.w = dst.w = surface->w;
src.h = dst.h = surface->h;
dst.x = x;
dst.y = y;
SDL_QueryTexture(texture, NULL, NULL, &src.w, &src.h);
ss.str(std::string().c_str());
}
void textManager::draw()
{
SDL_RenderCopy(Gfx::Instance()->getRenderer(), texture, &src, &dst);
}
textManager::~textManager()
{
if (texture != NULL)
SDL_DestroyTexture(texture);
font = NULL;
surface = NULL;
ss.clear();
delete surface;
}
每次调用 textManager::intToString
时,您都会使用 TTF_RenderText_Blended
创建一个表面,然后从该表面创建纹理。
您正在释放表面,但看起来您没有对纹理做同样的事情。这意味着纹理点的每一帧都将被重新分配,但内存不会被释放,从而导致持续的内存泄漏。
好的,所以我一直在尝试显示一个能够更新并反映在屏幕上的整数。 (e.x。显示鼠标位置的 x 和 y 坐标),它 运行 正是我想要的,但后来我打开了很好的 ol'task 管理器,看到我已经达到了大约 600mb 运行 7 分钟。当我注释掉我在屏幕上呈现的整数时(这样它们就不会绘制或更新)。该程序在 7 分钟后徘徊在 20mb 左右。我一直没有找到问题所在,谁能帮我找出我哪里出错了?谢谢
//TextMangager.h
#pragma once
#ifndef TEXTMANAGER_H
#define TEXTMANAGER_H
#include <SDL_ttf.h>
#include "graphicsManager.h"
#include <sstream>
struct textManager{
public:
textManager(){}
~textManager();
void SetText(std::string msg, int x, int y);
void draw();
void setFont(std::string filepath, int size);
void changeFontSize(int size);
int getWidth();
int getHeight();
void setColor(int r, int g, int b);
void intToString(Uint32 number, int x, int y);
private:
TTF_Font*font;
SDL_Texture*texture;
SDL_Rect dst;
SDL_Rect src;
SDL_Surface*surface;
SDL_Color color;
std::stringstream ss;
std::string text;
};
#endif // TEXTMANAGER_H
//TextManager.cpp的一部分
void textManager::intToString(Uint32 number, int x, int y)
{
ss << number;
text = ss.str().c_str();
surface = TTF_RenderText_Blended(font, text.c_str(), color);
if (surface == NULL)
cout << "surface is NULL \n" << SDL_GetError() << "\n";
texture = SDL_CreateTextureFromSurface(Gfx::Instance()->getRenderer(), surface);
SDL_FreeSurface(surface);
src.x = 0;
src.y = 0;
src.w = dst.w = surface->w;
src.h = dst.h = surface->h;
dst.x = x;
dst.y = y;
SDL_QueryTexture(texture, NULL, NULL, &src.w, &src.h);
ss.str(std::string().c_str());
}
void textManager::draw()
{
SDL_RenderCopy(Gfx::Instance()->getRenderer(), texture, &src, &dst);
}
textManager::~textManager()
{
if (texture != NULL)
SDL_DestroyTexture(texture);
font = NULL;
surface = NULL;
ss.clear();
delete surface;
}
每次调用 textManager::intToString
时,您都会使用 TTF_RenderText_Blended
创建一个表面,然后从该表面创建纹理。
您正在释放表面,但看起来您没有对纹理做同样的事情。这意味着纹理点的每一帧都将被重新分配,但内存不会被释放,从而导致持续的内存泄漏。