2012-04-08 15 views
1

Xlibとglxを適切に初期化して消去するクラスを作成しました。glXCreateContextを使用したメモリリーク

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はメモリリークを報告します。私は(librrfaker.so説明)VirtualGLを使用してい

==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側のバグだと思っていますか?

答えて

1

あなたはそれが自動的にバグだと思わないでください。 valgrindは最適化されたライブラリを扱うときに偽陽性結果を返すことがあります。ライブラリの最適化されていないビルドに対して実行していることを確認する必要があることを確認するためには、

編集

This extract from a valgrind manualそれが初期化されていない変数をチェックするとき、これが唯一の問題であることを示唆しています。以前は偽陽性に襲われたことを覚えていますが、今考えると初期化されていない値です。

+0

大丈夫です。なぜ偽陽性ですか? – qdii

+0

詳しい理由はわかりませんが、最適化されたバイナリを実行する際にデバッガがあまり信頼できない方法と似ていると思います。 – Troubadour

+1

違反はありませんが、私にはそう思わないでしょう。 Valgrindのドキュメントから読み込んだものを正しく覚えていれば、valgrindはプロセッサをエミュレートし、プログラムを実行します。この拡張されたプロセッサーから、どのメモリー・ロケーションがオペコードの影響を受けたかが推測されます。そのため、最適化されたコードがそのようなレベルでどのように違いを生み出すかがわかりません。 – qdii

0

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

実際には、これらがすべて初期化時に一度だけ呼び出される関数の場合です。それらは技術的にはリークですが、無視しても問題ありませんが、ソースが入手可能であれば、リークアップストリームを調べることができます。ドキュメントをチェック


glXChooseFBConfig上の戻り値は、それに呼ばXFreeで解放されることが期待されます。

関連する問題