سؤال

لقد تعثرت مؤخرًا في هذا الخطأ 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 مطلقًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top