最近在使用openresty,添加第三方的lua模块(luagd)时,发现:若将结构体按照userdata返回给lua,即使定义userdata时,同时指定了他的__gc回收函数,那么他也没有回收,内存会持续增长。当在lua中主动调用他的回收函数,那么内存将会释放!
请问__gc为何没生效,还是说我的使用有问题?
附: luagd.c
luaL_newmetatable(L, GD_IMAGE_PTR_TYPENAME);
lua_pushliteral(L, "__index");
lua_pushvalue(L, -3);
lua_settable(L, -3);
luaL_openlib(L, NULL, LgdMetatable, 0);
lua_pop(L, 1);
其中LgdMetatable如下:
static const luaL_reg LgdMetatable[] =
{
{ "__gc", LgdImageDestroy },
{ NULL, NULL }
};
LgdImageDestroy如下:
static int LgdImageDestroy(lua_State *L) {
gdImagePtr im = getImagePtr(L, 1);
if (im)
gdImageDestroy(im);
return 0;
}