SDL2 TTF“释放内存”,但实际上不是“释放内存”

问题描述

我正在尝试在SDL2 TTF中编辑文本,并且我发现在添加/减去文本时,内存没有减少。问题可能出在SDL_DestroyTextureSDL_FreeSurface中,但它也带来了加载字体的问题。我拥有文本的方式是在文本的第一个实例之后,我加载了所需的字体。然后,当最后一个实例为“免费”时,我关闭字体。这是它的代码Individual_Characters是我的文本课,基本上是它们的数组)

加载纹理


void Individual_Characters::Load_Character_Texture(SDL_Renderer *renderer)
{
    if (characterTexture != NULL){
        SDL_DestroyTexture(characterTexture);
        characterTexture = NULL;
    }



    if (character != "")
    {


        SDL_Surface *characterSurface = NULL;


        if (bold == true){
            characterSurface = TTF_RenderText_Blended(fontsBold[fontIndex],character.c_str(),characterColour);
        }

        if (bold == false){
            characterSurface = TTF_RenderText_Blended(fonts[fontIndex],characterColour);
        }



        if (!characterSurface){
            std::cout << "Could not create surface " << SDL_GetError() << std::endl;
        }

        else{
            characterTexture = SDL_CreateTextureFromSurface(renderer,characterSurface);
            SDL_FreeSurface(characterSurface);
            characterSurface = NULL;
        }


        SDL_QueryTexture(characterTexture,NULL,&characterRect.w,&characterRect.h);


    }

    else {

        characterRect.w = 0;
        characterRect.h = 0;

    }




}


设置单个字符

void Individual_Characters::Setup(SDL_Renderer *renderer,std::string p_character,int p_x,int p_y,int p_characterSize,SDL_Colour p_colour,bool p_bold,bool p_clickable,std::string p_fontType)
{
    if (setup == false){


        characterRect.x = p_x;
        characterRect.y = p_y;

        character = p_character;
        characterFont = p_fontType;
        characterSize = p_characterSize;
        characterColour = p_colour;
        clickable = p_clickable;
        bold = p_bold;


        fontIndex = characterSize - lowestFontSize -1;


        numOfInstances += 1;

        if (numOfInstances == 1){

            std::cout << "Character instance where initialising fonts  " << character << std::endl;

            TTF_Init();

            fonts.reserve(highestFontSize-lowestFontSize+1);
            fontsBold.reserve(highestFontSize-lowestFontSize+1);

            for (int i=lowestFontSize; i <= highestFontSize; i++)
            {
                TTF_Font *currentFont = TTF_OpenFont(characterFont.c_str(),i);

                TTF_Font *currentFontBold = TTF_OpenFont(characterFont.c_str(),i);
                TTF_SetFontStyle(currentFontBold,TTF_STYLE_BOLD);

                fonts.push_back(currentFont);
                fontsBold.push_back(currentFontBold);

            }

        }



        Load_Character_Texture(renderer);



    }



    setup = true;

}

,然后当我“退格”时,我首先称其为 ,然后在Individual_Characters之后弹出我的向量。



void Individual_Characters::Free_All()
{

    if (setup == true){



        if (characterTexture != NULL){
            SDL_DestroyTexture(characterTexture);
        }



        if (numOfInstances == 1){

            std::cout << "Character instance where closing fonts  " << character << std::endl;

            for (int i=0; i < fonts.size(); i++){
                TTF_CloseFont(fonts[i]);
                TTF_CloseFont(fontsBold[i]);
            }

            fonts.clear();
            fontsBold.clear();

            TTF_Quit();

        }


        numOfInstances -= 1;


    }


    setup = false;


}

numOfInstances是我拥有Individual_Characters的多少个实例,当我删除所有现有文本时,输出使我知道字体实际上是封闭的。无论如何。在加载文本之前,程序将位于30mb ram左右,而字体将加载70mb ram。很好,但是由于程序使用TTF_CloseFont(),因此即使释放后内存仍保持70mb。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

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