2009-11-14 2 views
2

아래 코드는 valgrind에서 작은 48 바이트 누출을 보여줍니다.내 간단한 GLX 앱에서 메모리가 누출되는 이유는 무엇입니까?

#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; 
} 

이 코드는 모두 GLX 렌더링을위한 창을 초기화 한 다음 해체합니다. 재미있는 것은, 내가 glXMakeCurrent()를 호출하자마자, 나는 48 바이트를 유출한다는 것입니다 ... Valgrind의 출력은 다음과 같습니다

[[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) 

당신은 바로 수면 전에) glXMakeCurrent (에 대한 호출을 주석 경우 누출은 사라질 것입니다 ... 물론, 아무것도 렌더링하기 위해 전화를해야합니다!

실제 문제는 내 응용 프로그램이 연결된 많은 GLX 컨텍스트가있는 많은 하위 창을 만듭니다 ... 그리고 각각이 동일한 48 바이트를 누출합니다 ... 코드를 정리하려고합니다. GLX 컨텍스트) ... 어떤 아이디어?

답변

2

좋아, 실제로 누출되지 않은 것 같습니다.

Valgrind는 여전히 누수를보고하지만 임의의 위치에 수천 개의 창을 가져오고 메모리가 맨 위에 완전히 평평한 테스트 응용 프로그램을 작성했습니다 ... 그래서 glx에 대한 억제 파일이 필요할 것 같습니다. 응용 프로그램.