在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1 lua中, userdata存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收 2 userdata也可以关联元表,不过只能通过luaL_newmetatable创建的元表 3 如果你的userdata关联了一些用户数据,需要userdata失效时也清理掉,那附加的元表可以设置__gc int __lua__call(lua_State* L) { // printf("hello lua userdata called!\n"); return 0; }
int __lua__gc(lua_State* L) { printf("hello lua gc called!\n"); 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);
}
|
请发表评论