2009-11-14 127 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應用。

相關問題