مكدس الاسترخاء في C ++ عند استخدام Lua
-
25-09-2019 - |
سؤال
لقد تعثرت مؤخرًا في هذا الخطأ C ++/LUA
int function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
return luaL_error(L,"something went wrong");
}
الخطأ هو ذلك luaL_error
استعمال longjmp
, ، لذلك المكدس لا يلفت s
لا يتم تدميرها أبدًا وتسرب الذاكرة. هناك عدد قليل من واجهة برمجة تطبيقات Lua التي تفشل في الاسترخاء على المكدس.
أحد الحلول الواضحة هو تجميع LUA في وضع C ++ مع استثناءات. ومع ذلك ، لا يمكنني أن يحتاج لابيند إلى المعيار C abi.
فكرتي الحالية هي كتابة وظائفي الخاصة التي تحاكي الأجزاء المزعجة من واجهة برمجة تطبيقات LUA:
// just a heads up this is valid c++. It's called a function try/catch.
int function_for_lua( lua_State* L )
try
{
/* code that may throw Lua_error */
}
catch( Lua_error& e )
{
luaL_error(L,e.what());
}
لذا سؤالي: هو function_for_lua
مكدس غير صحيح بشكل صحيح. هل يمكن أن يحدث خطأ ما؟
المحلول
إذا فهمت بشكل صحيح ، مع Luabind
يتم اكتشاف الوظائف التي ترمي استثناءات بشكل صحيح وترجمتها على أي حال. (يرى المرجعي.)
لذلك كلما احتجت إلى الإشارة إلى خطأ ، ما عليك سوى رمي استثناء قياسي:
void function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
// translated into lua error
throw std::runtime_error("something went wrong");
}
إخلاء المسئولية: لم أستخدم Lubind مطلقًا.
لا تنتمي إلى StackOverflow