最近在使用自己封住的一套lua庫使用中遇到這樣一個問題,多注冊一個類成員函數后,即便一個lua文件都沒加載,都會在lua_close中的freestack函數中crash
我的lua封裝非常簡單,支持C++類成員函數調用上也是在luaplus基礎上改造而來的:
void register_helper( lua_State* L, int tableindex, const char* funcname, lua_CFunction dispatcher, void* func, int sizeoffunc, const void* userdata, int sizeofud )
{
// function | userdata = lightuserdata
unsigned char* buffer = (unsigned char*)lua_newuserdata( L, sizeoffunc + sizeofud );
memcpy( buffer, (void*)func, sizeoffunc );
memcpy( buffer + sizeoffunc, &userdata, sizeofud );
lua_pushstring( L, funcname );
lua_pushlightuserdata( L, (void*)buffer);
lua_pushcclosure(L, dispatcher, 1);
lua_settable( L, tableindex );
}
檢查發現,貌似是lua_newuserdata的問題,將其換為malloc,問題解決了。
雖然支持google了一下類似的問題,并且也在gc庫內打過斷點,new出來的內存絕非簡單的被gc回收,而有可能是lua某些機制造成的,畢竟這樣給C++做綁定是很常見的
馬上做了一個list保存指針,并在lua_close之前清除這些指針,所有問題迎刃而解