2009-11-14 80 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应用。

相关问题