gpt4 book ai didi

c - 为什么我的简单 GLX 应用程序会泄漏内存?

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:34 27 4
gpt4 key购买 nike

下面的代码显示了 valgrind 中的一个小的 48 字节泄漏。

#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 输出如下所示:

[developer@localhost ~]$ 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)

如果你在 sleep 之前注释掉对 glXMakeCurrent() 的调用,泄漏就会消失......当然,我需要进行该调用才能渲染任何东西!

真正的问题是我的应用程序创建了许多子窗口,每个子窗口都关联了 GLX 上下文......并且每个都泄漏了相同的 48 字节......我不知道还能尝试什么(代码正在清理 GLX上下文)...有什么想法吗?

最佳答案

好的,看来真的没有漏水

Valgrind 仍在报告泄漏,但我编写了一个测试应用程序,它在随机位置显示了数千个窗口,并且内存通过顶部完全平坦...所以,看起来我需要一个用于 glx 应用程序的抑制文件.

关于c - 为什么我的简单 GLX 应用程序会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1735344/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com