【问题标题】:Memory leak in SDL2SDL2 中的内存泄漏
【发布时间】:2021-04-25 22:45:42
【问题描述】:

我正在尝试解决这个问题,但我很难过。当我不断地将鼠标悬停在一个对象上时,内存使用量会增加。悬停代码如下:

//Small memory leak here. Need to figure this out.
void PlayerInteraction::InteractionControllerHover(std::string interactionMessage) {
    SDL_DestroyTexture(Scene1::ftexture);
    SDL_FreeSurface(Scene1::fsurface);
    const char* im = interactionMessage.c_str();
    if (interactionMessage != "" ) {
        int interactionMessagelength = interactionMessage.length();
        Scene1::textRect = { 500, 610, interactionMessagelength * 10, 20 };   
        Scene1::fsurface = TTF_RenderText_Solid(Scene1::font, im, Scene1::fcolor);
        Scene1::ftexture = SDL_CreateTextureFromSurface(Scene1::renderer, Scene1::fsurface); 
       //_sleep(70) seems to slow the leak down.
    }
 }

如果我将 _sleep(70) 添加到代码中,内存泄漏会慢得多,但是我无法弄清楚它为什么会泄漏,因为每次悬停时我都会破坏纹理。我不喜欢添加睡眠,因为它会导致其他问题。有什么建议吗?

            //Mouse Hover Game Interaction.
            case SDL_MOUSEMOTION:      
                    //Event Motion coordinates. Where the mouse moves on the screen.
                    x = event.motion.x;
                    y = event.motion.y;
                    gd = gdSprite.x;
                    gy = gdSprite.y;

                    //This addresses the movement to the left issue where the player never reaches to destination and prevents hover interaction.
                    if (playerMessage != true && interactionMessage == "") { 
                        //Prevents sleep from kicking in when walking to a target.
                        if (gdSprite.x < gd && gdSprite.y < y || gdSprite.x > gd && gdSprite.y > y) {
                            ftexture = SDL_CreateTextureFromSurface(renderer, fsurface); //Potentially fixes sprite appearing in text.
                            SDL_DestroyTexture(ftexture);
                            playerIsMoving = 0; 
                        }
                       
                        else {                         
                            ftexture = SDL_CreateTextureFromSurface(renderer,fsurface); //Potentially fixes sprite appearing in text.
                            SDL_DestroyTexture(ftexture);
                            SDL_DestroyTexture(Textures::spriteTexture);
                            Textures::spriteTexture = SDL_CreateTextureFromSurface(renderer, Textures::spriteDown1); //Makes player face you when you are hovering.
                        }
                               
                        interactionMessage = pob.HoverObjects(x, y, scene, gd, gy);
                      
                    }
                    if (interactionMessage != "" && playerIsMoving !=1) {
                        _sleep(70); //reduces memory leak when repeatedly hovering over objects in quick succession.
                        pi.InteractionControllerHover(interactionMessage);                        
                      
                    }                 

                    break;                    
                
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                    case SDLK_q:
                    gameover = 1;
                    break;
                }
                break;          
            }
            
    }

【问题讨论】:

  • 欢迎来到 Stack Overflow。请edit您的问题包含您拥有的完整源代码作为minimal reproducible example,其他人可以编译和测试。
  • 完整源代码在这里:github.com/mr-tea79/theplanet
  • 请将您的代码添加到问题本身,而不是在外部网站上。
  • 在第一个代码 sn-p 中,您似乎泄漏了fsurface,因为它看起来不像您在任何地方释放旧表面。至于第二个 sn-p,我什至不知道该怎么想——为什么要在至少两个地方创建纹理并立即销毁它? fsurface 数据来自哪里?你能描述一下你认为这段代码应该做什么吗?
  • 出于某种原因,我不知道为什么,但我创建纹理并立即销毁它的原因是因为它似乎可以防止玩家精灵随机出现在文本框中(我不不知道为什么它会修复它,但它确实)

标签: sdl-2


【解决方案1】:

感谢您的建议。这似乎解决了问题:

void PlayerInteraction::InteractionControllerHover(std::string interactionMessage) {

const char* im = interactionMessage.c_str();
if (interactionMessage != "" ) {
    int interactionMessagelength = interactionMessage.length();
    Scene1::textRect = { 500, 610, interactionMessagelength * 10, 20 };   // The * 10, 20 is a mathematical way of setting the text width depending on the length of the text.
    Scene1::fsurface = TTF_RenderText_Solid(Scene1::font, im, Scene1::fcolor);
    Scene1::ftexture = SDL_CreateTextureFromSurface(Scene1::renderer, Scene1::fsurface);     
    SDL_FreeSurface(Scene1::fsurface);
  
}

     //Mouse Hover Game Interaction.
            case SDL_MOUSEMOTION:      
                    //Event Motion coordinates. Where the mouse moves on the screen.
                    x = event.motion.x;
                    y = event.motion.y;
                    gd = gdSprite.x;
                    gy = gdSprite.y;
                
                    //This addresses the movement to the left issue where the player never reaches to destination and prevents hover interaction.
                    if (playerMessage != true && interactionMessage == "") {                          
                        //Prevents sleep from kicking in when walking to a target.
                        if (gdSprite.x < gd && gdSprite.y < y || gdSprite.x > gd && gdSprite.y > y) {
                            SDL_DestroyTexture(ftexture);
                            playerIsMoving = 0;                           
                        }
                       
                        else {                               
                            SDL_DestroyTexture(ftexture);
                            SDL_DestroyTexture(Textures::spriteTexture);
                            Textures::spriteTexture = SDL_CreateTextureFromSurface(renderer, Textures::spriteDown1); //Makes player face you when you are hovering.
                        }
                      
                            interactionMessage = pob.HoverObjects(x, y, scene, gd, gy);   
                       
                    }

                    if (interactionMessage != "" && playerIsMoving !=1) {                                           
                        pi.InteractionControllerHover(interactionMessage);
                    }                 

                    break;                    
                
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                    case SDLK_q:
                    gameover = 1;
                    break;
                }
                break;          
            }
            
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多