2009-11-14 3 views
2

Le code ci-dessous montre une petite fuite de 48 octets dans valgrind.Pourquoi ma simple application GLX perd-elle de la mémoire?

#include <X11/Xlib.h> 
#include <GL/glx.h> 
#include <unistd.h> 

int main(int argc, char* argv[]) 
{ 
    Display* _display; 
    Window _windowHandle; 
    XVisualInfo* _visual; 
    GLXContext _context; 
    Atom _deleteWindowMessage; 
    Atom _pingWindowMessage; 

    _display = XOpenDisplay(NULL); 

    int attributes[] = { GLX_RGBA, 
         GLX_DOUBLEBUFFER, 
         GLX_RED_SIZE, 8, 
         GLX_BLUE_SIZE, 8, 
         GLX_GREEN_SIZE, 8, 
         GLX_ALPHA_SIZE, 8, 
         GLX_DEPTH_SIZE, 8, 
         GLX_STENCIL_SIZE, 0, 
         0 }; 

    _visual = glXChooseVisual(_display, 
           DefaultScreen(_display), 
           attributes); 

    _context = glXCreateContext(_display, 
           _visual, 
           0, 
           GL_TRUE); 

    Colormap colormap; 

    colormap = XCreateColormap(_display, 
           RootWindow(_display, _visual->screen), 
           _visual->visual, 
           AllocNone); 

    XSetWindowAttributes windowAttributes; 

    windowAttributes.colormap = colormap; 
    windowAttributes.border_pixel = 0; 
    windowAttributes.event_mask = ExposureMask | StructureNotifyMask; 


    _windowHandle = 
     XCreateWindow(_display, 
         RootWindow(_display, _visual->screen), 
          0, 
          0, 
          1280, 
          720, 
          0,      // Borderwidth 
          _visual->depth,   // Depth 
          InputOutput, 
          _visual->visual, 
          CWBorderPixel | CWColormap | CWEventMask, 
          &windowAttributes); 
    XFreeColormap(_display, colormap); 


    XMapWindow(_display, _windowHandle); 

    // causes 48 byte leak... 
    glXMakeCurrent(_display, 
        _windowHandle, 
        _context); 

    sleep(3); 

    XUnmapWindow(_display, _windowHandle); 


    XDestroyWindow(_display, _windowHandle); 


    glXMakeCurrent(_display, 
        None, 
        NULL); 

    glXDestroyContext(_display, _context); 

    XFree(_visual); 

    XCloseDisplay(_display); 

    return 0; 
} 

Tout ce code initialise une fenêtre pour le rendu GLX, puis l'annule. Le plus drôle est que, dès que je l'appelle glXMakeCurrent(), je fuite 48 octets ... La sortie valgrind ressemble à ceci:

[[email protected] ~]$ valgrind --tool=memcheck --leak-check=full ./simplex 
==9531== Memcheck, a memory error detector 
==9531== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. 
==9531== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info 
==9531== Command: ./simplex 
==9531== 
==9531== 
==9531== HEAP SUMMARY: 
==9531==  in use at exit: 248 bytes in 6 blocks 
==9531== total heap usage: 1,265 allocs, 1,259 frees, 2,581,764 bytes allocated 
==9531== 
==9531== 48 bytes in 1 blocks are definitely lost in loss record 5 of 6 
==9531== at 0x400591C: malloc (vg_replace_malloc.c:195) 
==9531== by 0x349D0F8: ??? (in /usr/lib/nvidia/libGL.so.180.60) 
==9531== 
==9531== LEAK SUMMARY: 
==9531== definitely lost: 48 bytes in 1 blocks 
==9531== indirectly lost: 0 bytes in 0 blocks 
==9531==  possibly lost: 0 bytes in 0 blocks 
==9531== still reachable: 200 bytes in 5 blocks 
==9531==   suppressed: 0 bytes in 0 blocks 
==9531== Reachable blocks (those to which a pointer was found) are not shown. 
==9531== To see them, rerun with: --leak-check=full --show-reachable=yes 
==9531== 
==9531== For counts of detected and suppressed errors, rerun with: -v 
==9531== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 30 from 8) 

Si vous commentez l'appel à glXMakeCurrent() juste avant le sommeil , la fuite s'en ira ... Bien sûr, j'ai besoin de faire cet appel pour rendre n'importe quoi!

Le vrai problème est que mon application crée de nombreuses fenêtres enfants, chacune avec des contextes GLX associés ... et chacun fuit ce même 48 octets ... Je ne sais pas quoi d'autre à essayer (le code nettoie le Contexte GLX) ... Des idées?

Répondre

2

Ok, on dirait que ça ne fuit pas vraiment. Valgrind signale toujours la fuite, mais j'ai écrit une application de test qui affiche des milliers de fenêtres dans des emplacements aléatoires et la mémoire est complètement plate par dessus ... Donc, on dirait que j'ai besoin d'un fichier de suppression pour glx applications.

Questions connexes