C++ SDL2 TTF“;“释放内存”;但实际上并非如此;“释放内存”;
我试图在SDL2TTF中编辑文本,我注意到当我添加/减去文本时,内存没有下降。问题可能出在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 *
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;
}