オブジェクト/テーブルがゴミ収集されたときにホストアプリケーションを通知する方法

StackOverflow https://stackoverflow.com/questions/4090586

質問

私のホスト c LUAインタープリターを埋め込んだアプリケーションは、LUAスクリプトの実行中の特定のオブジェクト/テーブルがガベージが収集されていることを通知する必要があるため、このイベントを記録してファイルを記録するなど、何かを行います。どうやってやるの?

役に立ちましたか?

解決

userDataにメタテュタブルを追加し、メタテイブルに「__GC」関数を追加します。

LUA 5.1では、「__GC」メタメソッドをサポートしているのはUserDataのみです。

LUAテーブルのごみ収集を検出する1つの方法は、そのテーブルにCanary UserDataオブジェクトを追加することです。

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ユーザーDATAオブジェクトにメタテイブルを作成して追加するコード:

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. */
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top