即使释放了SDL2中的表面和纹理,内存也不断增加

问题描述

我有一个文本对象,它具有设置,绘制和自由功能。只是为了测试我的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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...