最近在使用自己封住的一套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之前清除这些指针,所有问题迎刃而解