2

このようなことをしても安全ですか?

int foo(Display*, XErrorEvent*) {
  throw 0;
}
XSetErrorHandler(foo);

トラブルに巻き込まれない?

4

1 に答える 1

4

X11エラーハンドラーは、ユーザーによって提供され、Xlibによって呼び出されるコールバックです。エラーハンドラからスローされた例外は、Xlibコードを介してXlibを呼び出すユーザーコード(通常はXNextEventまたはその仲間)に伝播します。

               foo() <C++>
                 |
       [error is detected by Xlib] <C>
                 |
          [some more Xlib code] <C>
                 |
            [some Xlib code] <C>
                 |
             XNextEvent()  <C>                 
                 |
               main() <C++>

XlibはC++で記述されていないため、C++ランタイムはXlibコードのスタックアンワインドを実行する方法を必ずしも認識していません。運が良ければ巻き戻しを正しく行うことができたとしても、エラーハンドラを呼び出す前にXlibによって割り当てられたメモリなどのリソースが失われる可能性があります。Cには自動デストラクタはありません!

于 2012-04-25T17:16:35.010 に答える