2010-10-23 11 views
6

recente ho imbattuti in questo questo C errore ++/LuaStack rilassarsi in C++ quando si utilizza Lua

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

L'errore è che luaL_error uso longjmp, quindi la pila è mai svolto e s viene mai distrutto, perde la memoria. Vi sono altre API Lua che non riescono a svolgere lo stack.

Una soluzione ovvia è compilare Lua in modalità C++ con eccezioni. Io, tuttavia, non posso perché Luabind ha bisogno dell'ABI standard.

Il mio pensiero attuale è quella di scrivere le mie funzioni che imitano le parti fastidiosi delle 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()); 
} 

Quindi la mia domanda è: function_for_lua s' pila correttamente svolto. Qualcosa può andare storto?

+0

Sono confuso quando hai menzionato Luabind. Luabind è una libreria C++, ma sembra che tu non la stia utilizzando comunque? – dvide

risposta

2

Se ho capito bene, con le funzioni Luabind le eccezioni sono correttamente catturate e tradotte comunque. (Vedere reference.)

Così ogni volta che è necessario indicare un errore, solo un'eccezione di serie:

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

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

Disclaimer: io ho mai usato Lubind.

+0

non è 'std :: runtime_error' :)? –

+0

@Armen: devi tenere la gente sulle spine. – GManNickG

Problemi correlati