问题描述
我有一个文本对象,它具有设置,绘制和自由功能。只是为了测试我的free函数是否完全释放了所有正在使用的内存,我创建了一个循环来不断设置和释放它。这样做,程序的内存使用率仅以约0.2mb / s的速度增长,因此很明显我遗漏了一些东西。我在代码中找不到任何可以释放内存使用量的东西。如果有人可以帮助您找出问题所在,谢谢!
以下是部分:
text.cpp :此Load_Text_Textures加载表面并为文本和周围的东西创建纹理
void Text::Load_Text_Textures(SDL_Renderer *renderer)
{
textSurface = TTF_RenderText_Blended(fonts[fontIndex],text.c_str(),colour); ///Recreate the textures/surfaces
if (!textSurface){
cout << "Unable to create surface of text " << text << " error is: " << SDL_GetError() << endl;
}
textTexture = SDL_CreateTextureFromSurface(renderer,textSurface);
if (!textTexture){
cout << "Unable to create texture from surface of text " << text << " error is: " << SDL_GetError() << endl;
}
SDL_FreeSurface(textSurface);
textSurface = NULL;
SDL_QueryTexture(textTexture,NULL,&textW,&textH);
textRect = {x,y,textW,textH};
}
我在哪里设置
void Text::Setup(SDL_Renderer *renderer,string txt,int xPos,int yPos,int txtSize,SDL_Color Colour,bool isBold,string fontType,bool isWrapped,int theWrapWidth,bool isClickable )
{
if (setup == false){
numOfInstances += 1;
clickable = isClickable;
wrapped = isWrapped;
wrappedWidth = theWrapWidth;
text = txt;
textSize = txtSize;
bold = isBold;
colour = Colour;
textW = 0;
textH = 0;
x = xPos;
y = yPos;
initialX = x;
initialY = y;
fontIndex = textSize-lowestFontSize -1;
if (textTexture != NULL){
SDL_DestroyTexture(textTexture); ///Free memory not going to be used again.
textTexture = NULL;
}
if (text != ""){ ///Only create textures if there is text
///Load consecutive widths and height of text for hovering over
Load_Text_Widths(renderer);
Load_Text_Textures(renderer); ///Loads textures/surfaces/whatever
}
setup = true;
}
else{
//cout << "Trying to setup a text already setup! " << text << endl;
}
}
我在哪里释放内存
void Text::Free_All()
{
if (setup == true){
if (textSurface == NULL){
//cout << "Text surface already free'd" << endl;
}
else{
SDL_FreeSurface(textSurface);
textSurface = NULL;
//cout << "Free'd surface \n";
}
if (textTexture == NULL){
//cout << "Could not free memory for text \"" << text << "\". Error from SDL is: " << TTF_GetError() << endl;
}
else{
SDL_DestroyTexture(textTexture);
textTexture = NULL;
}
///For TTF_Init();
numOfInstances -= 1;
//cout << "Free'd " << text << endl;
}
else{
//cout << "Text not setup yet when trying to free!" << endl;
}
setup = false;
}
在测试部分,这就是我要做的
counter += 1;
if (counter % 2 == 0){
testText.Setup(renderer,"Some Text",300,200,60,{0,0},false,"arial.ttf",false);
}
else{
testText.Free_All();
}
testText.Draw_Text(renderer);
因此,每个循环我要么释放文本要么进行设置。它从设置btw开始,因此在它之前加1只是意味着它将释放它已经设置的位置。我只是无法弄清它没有释放未使用的内存的位置。
编辑:
void Text::Load_Text_Widths(SDL_Renderer *renderer)
{
if (clickable == false){
string currentChars;
widthsOfCharacters.clear();
for (int j=0; j < text.length(); j++){
currentChars = "";
for (int k=0; k <= j; k++){ ///make currentChars equal to the characters in "text" up to the index of j
currentChars += text[k];
}
int w,h;
if (bold == true){
TTF_SizeText(fontsBold[fontIndex],currentChars.c_str(),&w,&h);
}
else{
TTF_SizeText(fonts[fontIndex],&h);
}
widthsOfCharacters.push_back(w);
heightsOfCharacters.push_back(h);
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)