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 回答