X的错误处理程序抛出异常是否安全?

时间:2012-04-25 15:02:24

标签: c++ x11 xlib

做这样的事情是否安全?

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

我不会遇到任何麻烦吗?

1 个答案:

答案 0 :(得分: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中没有自动析构函数。