C++ SDL2 TTF“;“释放内存”;但实际上并非如此;“释放内存”;

C++ SDL2 TTF“;“释放内存”;但实际上并非如此;“释放内存”;,c++,sdl-2,sdl-ttf,C++,Sdl 2,Sdl Ttf,我试图在SDL2TTF中编辑文本,我注意到当我添加/减去文本时,内存没有下降。问题可能出在SDL_DestroyTexture和SDL_FreeSurface中,但这也会造成字体加载问题。我拥有文本的方式是在第一个文本实例之后,加载所需的字体。然后,当最后一个实例为“free'd”时,我关闭字体。下面是它的代码(单个字符是我的文本类,基本上是它们的数组) 加载纹理 void Individual_Characters::Load_Character_Texture(SDL_Renderer *

我试图在SDL2TTF中编辑文本,我注意到当我添加/减去文本时,内存没有下降。问题可能出在
SDL_DestroyTexture
SDL_FreeSurface
中,但这也会造成字体加载问题。我拥有文本的方式是在第一个文本实例之后,加载所需的字体。然后,当最后一个实例为“free'd”时,我关闭字体。下面是它的代码(
单个字符
是我的文本类,基本上是它们的数组)

加载纹理


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], character.c_str(), 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, NULL, &characterRect.w, &characterRect.h);


    }

    else {

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

    }




}



numOfInstances
是我拥有的
单个字符的实例数,当我删除所有现有文本时,输出让我知道字体实际上已关闭。不管怎样。在加载文本之前,当字体加载时,程序的内存约为
30mb
ram。这很好,但是由于程序使用了
TTF\u CloseFont()
,即使在释放内存后,内存仍然保持在70mb。

有效的测试是,如果您在一个迭代1000次的循环中执行所有这些操作。在这种情况下,每次迭代的内存都会增加吗?如果不是,那么你看到的是C++内存管理器是如何工作的,它并没有天真地将内存返回操作系统——相反,它保留内存,以防有进一步的分配。当我添加输入(第一个字母)时,我得到的输出是,
字符实例,其中初始化字体“a”
,例如,当我退格时,我得到
字符实例,其中关闭字体“a”
。内存不是由操作系统释放的,而是由程序释放的。这是一个问题,因为当我添加文本时,比如说一个1000长的字符串,它可能会使用几个100mb的ram,然后当我全部退格时,内存不会被释放到操作系统,而只是在程序中。添加文本在达到以前的用法之前不会使用更多maximum@peterwilson这不是一个SDL相关的问题,但很常见。如果我说的不清楚,基本上我输入了一堆东西,程序从70mb到500mb,然后当我全部退格时,保持在500。当我添加文本时,它不会变为501mb,直到我有效地达到相同的文本长度,然后我希望程序只使用我需要的内存量——内存管理器假设您需要1GB,因为这是您的程序分配的。如果内存管理器对底层操作系统执行了一对一的分配/解除分配方案,那么您的程序运行速度可能会慢很多。同样到目前为止,你还没有证明你有“记忆不足”的情况——唯一的问题是担心记忆可能会耗尽。这就是为什么在第一条评论中,我问您是否在循环中运行代码。
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;

}


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;


}