2010-11-03 19 views
7

Ev sahibi C uygulama, bir Lua yorumlayıcısının gömülü olduğu, Lua komut dosyasının çalıştırılmasında belirli nesne/tablonun çöp toplandığı bildirilmesi gerekir, bu yüzden bir şeyler yapar , bu olayı kayıt dosyasına kaydetmek gibi. Bunu nasıl yapabilirim? Userdata'ya bir metatable ekleyerek ve metatable'a "__gc" işlevi ekleyerekNesne/tablo çöp toplanırken ana bilgisayar uygulamasına nasıl bildirilir

cevap

12

. oluşturmak ve bir userdata nesneye bir MetaTable eklemek için

function create_canary(tab) 
    local canary=newproxy(true) 
    local meta=getmetatable(canary) 
    meta.__gc = function() print("Canary is died:", tab) end 
    tab[canary] = canary 
end 

C kodu: Lua tabloları çöp toplama algılamak için

In Lua 5.1, only userdata has support for the "__gc" methamethod.

bir yolu olduğunu tabloya kanarya userdata nesnesi eklemektir

static int userdata_gc_method(lua_State *L) { 
    UserObj *ud = lua_touserdata(L, 1); 
    /* TODO: do something */ 
    return 0; 
} 
static int create_userdata_obj(lua_State *L) { 
    UserObj *ud = lua_newuserdata(L, sizeof(UserObj)); 
    /* TODO: initialize your userdata object here. */ 

    lua_newtable(L); /* create metatable. */ 
    lua_pushliteral(L, "__gc"); /* push key '__gc' */ 
    lua_pushcfunction(L, userdata_gc_method); /* push gc method. */ 
    lua_rawset(L, -3); /* metatable['__gc'] = userdata_gc_method */ 
    lua_setmetatable(L, -2); /* set the userdata's metatable. */ 
    return 1; /* returning only the userdata object. */ 
} 
+0

Çözüm şu anda im kullanıyor. Daha iyi bir tane olduğunu düşündüm. BTW Bu yeni proxy nedir (doğru)? – Vertilka

+0

newproxy (true) - bir userdata nesnesi (boyut = 0 ile) ve bir metatable oluşturur. Lua'nın belgelenmemiş bir özelliğidir. Burada daha fazla okuyabilirsiniz: http://lua-users.org/wiki/HiddenFeatures – Neopallium

İlgili konular