У меня есть следующая функция lua_CFunction, написанная на C ++:
int my_function(lua_State* L) {
int x = 0;
try {
x = do_cpp_stuff_that_invokes_lua_API_as_well();
} catch(const std::exception& ex) {
lua_pushstring(ex.what().c_str());
lua_error(L);
}
return x;
}
Мой вопрос заключается в следующем: нормально ли делать lua_error (L) или вызывать любую функцию lua, которая может longjmp:
Я позабочусь о переменных, размещенных в стеке, просто не выделяя ничего, что будет зависеть от деструктора (строка и т. Д.). Если мне нужно сделать это, тогда все функции lua в этой области обернуты в pcall, и если этот pcall терпит неудачу, исключение выдается для этой функции, которую я опубликовал. Просто меня интересуют блоки try-catch.
Большое спасибо
Соответствующее правило (§18.10 [support.runtime] / p4):
Подпись функции
longjmp(jmp_buf jbuf, int val)
имеет больше
ограниченное поведение в этом международном стандарте.setjmp/longjmp
Пара вызовов имеет неопределенное поведение при заменеsetjmp
а также
longjmp
отcatch
а такжеthrow
будет ссылаться на любой нетривиальный
деструкторы для любых автоматических объектов.
Стандарт C ++ не ограничивает использование setjmp
а также longjmp
,
Если вы делаете длинный прыжок из блока catch, вы, по крайней мере, собираетесь утратить память, используемую для хранения объекта исключения. Компилятор генерирует код, освобождающий эту память на путях потока управления, выходящих из области действия блока catch. Если вы делаете длинный прыжок, ни один из этих путей не будет взят.
Документация Sun Studio запрещает смешивать исключения и longjmp явно:
В частности, вы не должны делать longjmp в или из блока try или catch (прямо или косвенно) или longjmp после инициализации или нетривиального уничтожения авто переменных или временных переменных.