2010-10-23 15 views
6

Gần đây tôi đã vấp vào này C++/Lua lỗistack ươm trong C++ khi sử dụng Lua

int function_for_lua(lua_State* L) 
{ 
    std::string s("Trouble coming!"); 
    /* ... */ 
    return luaL_error(L,"something went wrong"); 
} 

Lỗi là luaL_error sử dụng longjmp, vì vậy chồng không bao giờ là unwound và s không bao giờ được destructed, rò rỉ bộ nhớ. Có thêm một vài API của Lua không giải phóng được stack.

Một giải pháp hiển nhiên là biên dịch Lua trong chế độ C++ với ngoại lệ. Tôi, tuy nhiên, không thể như Luabind cần tiêu chuẩn C ABI.

suy nghĩ hiện tại của tôi là để viết các chức năng của riêng tôi mà bắt chước những phần phiền hà của API 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()); 
} 

Vì vậy, câu hỏi của tôi: Liệu function_for_lua 's chồng đúng unwound. Có thể có điều gì sai?

+0

Tôi đang bối rối khi bạn đề cập Luabind. Luabind chính nó là một thư viện C++, nhưng có vẻ như bạn không sử dụng nó? – dvide

Trả lời

2

Nếu tôi hiểu chính xác, với Luabind các chức năng ném ngoại lệ được bắt và dịch đúng cách. (Xem reference.)

Vì vậy, bất cứ khi nào bạn cần phải chỉ ra một lỗi, chỉ cần ném một ngoại lệ tiêu chuẩn:

void function_for_lua(lua_State* L) 
{ 
    std::string s("Trouble coming!"); 
    /* ... */ 

    // translated into lua error 
    throw std::runtime_error("something went wrong"); 
} 

Disclaimer: Tôi chưa từng sử dụng Lubind.

+0

không phải là nó 'std :: runtime_error' :)? –

+0

@Armen: Gotta giữ mọi người trên ngón chân của họ. – GManNickG

Các vấn đề liên quan