IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

SDL2_ttf et fuite de mémoire


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 21
    Points : 22
    Points
    22
    Par défaut SDL2_ttf et fuite de mémoire
    Bonjour à tous !

    Alors voici le problème, je m'etais fait une petite fonction pour afficher du texte dans un 'renderer' puis en testant un projet que je fais actuellement avec Valgrind (qui implémente cette fameuse fonction) je me suis rendu compte qu'il y avait une fuite de mémoire (oulah) et après une bonne heure de recherche j'ai pu isoler la partie problématique qui était cette fameuse fonction.

    Alors j'en ai fait un petit exemple pour vous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_ttf.h>
     
    void renderText(SDL_Renderer* renderer, const char* text, int const size, const SDL_Rect text_rect, const SDL_Color text_color)
    {
        #ifdef __linux__
          const char* font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
        #elif _WIN32
          const char* font_path = "C:\\Windows\\Fonts\\Arial.ttf";
        #endif
     
        TTF_Font* font = TTF_OpenFont(font_path, size);
     
        if (!font) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_ttf - %s", TTF_GetError()); return; }
     
        SDL_Surface* text_surface = TTF_RenderText_Blended(font, text, text_color);
        SDL_Texture* text_texture = SDL_CreateTextureFromSurface(renderer, text_surface);
        if (text_color.a!=255)      SDL_SetTextureAlphaMod(text_texture, text_color.a);
     
        SDL_RenderCopy(renderer, text_texture, NULL, &text_rect);
     
        SDL_DestroyTexture(text_texture);
        SDL_FreeSurface(text_surface);
        TTF_CloseFont(font);
    }
     
    int main(int argc, char** argv)
    {
        //(void)argc; (void)argv;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        TTF_Init();
     
        SDL_Window* win = SDL_CreateWindow("Exemple pour fuite de mémoire avec SDL2_ttf", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
     
        SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
     
        SDL_Event event;
     
        SDL_bool running = SDL_TRUE;
     
        while (running)
        {
            while (SDL_PollEvent(&event))
            {
                running = event.type != SDL_QUIT;
            }
     
            renderText(ren, "Coucou les devs !", 22, (SDL_Rect){ (640-256)/2, (480-64)/2, 256, 64 }, (SDL_Color){ 255, 255, 255, 255 });
     
            SDL_RenderPresent(ren);
        }
     
        SDL_DestroyRenderer(ren);
        SDL_DestroyWindow(win);
        TTF_Quit();
        SDL_Quit();
     
      return 0;
     
    }
    Petite commande gcc pour gagner du temps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc main.c -o main -lSDL2 -lSDL2_ttf
    J'utilise cette commande pour Valgrind:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valgrind --tool=memcheck --leak-check=full --leak-resolution=high --show-reachable=yes ./main
    Et il me ressors (que ce soit pour cet exemple ou mon projet):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ==79266== LEAK SUMMARY:
    ==79266==    definitely lost: 504 bytes in 1 blocks
    ==79266==    indirectly lost: 43,152 bytes in 235 blocks
    ==79266==      possibly lost: 8,496 bytes in 44 blocks
    ==79266==    still reachable: 274,261 bytes in 3,422 blocks
    ==79266==         suppressed: 0 bytes in 0 blocks
    Je précise encore, c'est exactement le même résultat entre mon projet et l'exemple, à l'octet près et la je sèche un peu, cela viendrait t-il de ma version de SDL2_ttf ?

    Merci d'avance pour votre attention !

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    J'ai été demander sur StackOverflow et il semblerait que ça vient simplement de SDL qui laisse decharger certaines allocations au retour de main de ce que j'ai compris, je vous laisse allez voir si vous voulez en savoir plus: https://stackoverflow.com/questions/...47986#73547986

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fuite de mémoire ?
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 17h19
  2. Réponses: 1
    Dernier message: 02/12/2005, 15h18
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 11h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 21h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo