Безопасно ли делать что-то подобное?
int foo(Display*, XErrorEvent*) {
throw 0;
}
XSetErrorHandler(foo);
У меня не будет проблем?
Безопасно ли делать что-то подобное?
int foo(Display*, XErrorEvent*) {
throw 0;
}
XSetErrorHandler(foo);
У меня не будет проблем?
Обработчик ошибок 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 нет автоматических деструкторов!