1

Xlibとglxを適切に初期化してクリアするためのクラスを作成しました。 

OpenGLContext::OpenGLContext()
    :m_display(nullptr)
    ,m_context(nullptr)
    ,m_vi(nullptr)
{
    memset(&m_cmap, 0, sizeof(Colormap));
    memset(&m_swa, 0, sizeof(XSetWindowAttributes));
    memset(&m_win, 0, sizeof(Window));
    m_display = XOpenDisplay(NULL);
    assert(m_display);

    static int dblBuf[] =  {GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 12, GLX_DOUBLEBUFFER, None};
    m_vi = glXChooseVisual(m_display, DefaultScreen(m_display), dblBuf);
    m_context = glXCreateContext(m_display, m_vi, None, True);
    m_cmap = XCreateColormap(m_display, RootWindow(m_display, m_vi->screen), m_vi->visual, AllocNone);
    m_swa.colormap = m_cmap;
    m_win = XCreateWindow(
                m_display,
                RootWindow(  m_display, m_vi->screen  ),
                0, 0, /* width */ 640, /* height */ 480, 0, m_vi->depth, InputOutput, m_vi->visual,
                CWBorderPixel | CWColormap | CWEventMask, &m_swa
            );

    char* dummy[] = { "", 0 };
    XSetStandardProperties(m_display, m_win, "glxsimple", "glxsimple", None, dummy, 0, NULL);
    glXMakeCurrent(m_display, m_win, m_context);
    XMapWindow(GetDisplay(), GetWindow());
}

OpenGLContext::~OpenGLContext()
{
    XUnmapWindow(m_display, m_win);
    glXMakeCurrent(m_display, None, NULL);
    XFreeColormap(m_display, m_cmap);
    XDestroyWindow(m_display, m_win);
    glXDestroyContext(m_display, m_context);
    XFree(m_vi);
    XCloseDisplay(m_display);
}

残念ながら、valgrindはメモリリークを報告します。

==28742== 12,796 (584 direct, 12,212 indirect) bytes in 1 blocks are definitely lost in loss record 631 of 637
==28742==    at 0x4C29F5D: malloc (vg_replace_malloc.c:263)
==28742==    by 0xBCD7E7C: driConcatConfigs (in /usr/lib64/mesa/swrastg_dri.so)
==28742==    by 0xBCDBDFF: dri_init_screen_helper (in /usr/lib64/mesa/swrastg_dri.so)
==28742==    by 0xBCDAF0D: drisw_init_screen (in /usr/lib64/mesa/swrastg_dri.so)
==28742==    by 0xBCD8583: driCreateNewScreen (in /usr/lib64/mesa/swrastg_dri.so)
==28742==    by 0x5295604: driswCreateScreen (in /usr/lib64/opengl/xorg-x11/lib/libGL.so.1.2)
==28742==    by 0x527412B: __glXInitialize (in /usr/lib64/opengl/xorg-x11/lib/libGL.so.1.2)
==28742==    by 0x5270154: glXGetFBConfigs (in /usr/lib64/opengl/xorg-x11/lib/libGL.so.1.2)
==28742==    by 0x5270B57: glXChooseFBConfig (in /usr/lib64/opengl/xorg-x11/lib/libGL.so.1.2)
==28742==    by 0x4E9A7CE: ??? (in /usr/lib64/librrfaker.so)
==28742==    by 0x4E5B676: glXChooseVisual (in /usr/lib64/librrfaker.so)
==28742==    by 0x46D23B: Zion::Core::OpenGLContext::OpenGLContext() (OpenGLContext.cpp:23)

私はVirtualGL(librrfaker.soを説明しています)を使用していることに注意してください。私が間違ったことはありますか?または、これはVirtualGL側のバグであると想定する必要がありますか?

4

2 に答える 2

1

それがバグだと自動的に想定するべきではありません。valgrindは、最適化されたライブラリを処理するときに誤検知の結果を返すことがあります。確実にするには、ライブラリの最適化されていないビルドに対して実行していることを確認する必要があります。

編集

valgrindマニュアルからのこの抜粋は、これが初期化されていない変数をチェックする場合にのみ問題になることを示唆しています。以前は誤検知に見舞われたことを覚えていますが、今考えてみると、実際には初期化されていない値でした。

于 2012-04-08T19:43:18.407 に答える
1

これは実際のメモリ リークである可能性が高く、Valgrind はライブラリ内のリークも検出します。

実際には、たとえば、これらが初期化時に一度だけ呼び出される関数である場合。技術的にはリークですが、無視しても問題ありません。また、必要に応じて、ソースが利用可能な場合は上流でリークを調査することもできます。


ドキュメントを確認すると、glXChooseFBConfigで戻り値が呼び出されて解放されることが期待されますXFree

于 2015-09-10T09:40:08.780 に答える