1 lua中, userdata存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收
2 userdata也可以关联元表,不过只能通过luaL_newmetatable创建的元表
3 如果你的userdata关联了一些用户数据,需要userdata失效时也清理掉,那附加的元表可以设置__gc
int __lua__call(lua_State* L)
{
//
//栈底是userdata,上面是参数如果有的话, 普通的C函数调用栈只有参数
//
printf("hello lua userdata called! ");
return 0;
}
int __lua__gc(lua_State* L)
{
printf("hello lua gc called! ");
return 0;
}
void testmatetable()
{
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "sleep", sleep_c);
luaL_newmetatable(L, "lua.userdata.metatable");
lua_pushliteral(L,"__call");
lua_pushcfunction(L, __lua__call);
lua_settable(L,-3);
/*
//
//创建__gc
//
lua_pushliteral(L,"__gc");
lua_pushcfunction(L, __lua__gc);
lua_settable(L,-3);
*/
lua_pop(L, 1);
//
//int lua_setmetatable (lua_State *L, int index); 给LUA值设置metatable
//metatable存放在栈顶,LUA值通过index指出
//
//
//创建userdata并关联metatable
//
//unsigned int* fidptr = (unsigned int *)lua_newuserdata(L, sizeof(unsigned int));
//*fidptr = 998;
//
//值关联数字的话可以用lua_pushlightuserdata
//
lua_pushlightuserdata(L, (void*)998);
luaL_getmetatable(L, "lua.userdata.metatable");
lua_setmetatable(L, -2);
//
//现在栈顶上就只有创建的userdata了,把它设置到全局变量里面这样LUA能正常访问
//
//
lua_setfield(L, LUA_GLOBALSINDEX, "hellouserdata");
//
//.test
//
luaL_loadstring(L, "hellouserdata (1,2,3); sleep(2000)");
lua_call(L,0,0);
lua_close(L);
}