아래 코드는 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 컨텍스트) ... 어떤 아이디어?