1

作成中のアプリケーションで Lua の C API を使用していますが、その使用方法によって (ポインターへの) ぶら下がりポインターが残っているかどうかを判断しようとしています。

C ++で構造(実際にはクラス)のようなツリーがあるとします

struct Leaf
{
  DoSomeLeafStuff();
  List<Leaf*> Children;
};

class Tree
{
public:
  Tree() { };
  virtual ~Tree() 
  { 
    /* iterate over Children and delete them */ 
  };

  void DoSomeTreeStuff();
  Leaf getRoot() const { return _root; }

private:
  Leaf* _root;
};

-- が既に作成され、データが含まれていると仮定treeし、Lua で次のように使用します。

local root = tree:getRoot()
root:DoSomeLeafStuff()

Luaの私の C 実装はgetRoot()次のようになります。

int LuaStuff::TreeGetRoot(lua_State* L)
{
  Tree* tree = *(Tree**)luaL_checkudata(L, 1, "MyStuff.Tree");

  if (tree != NULL && tree->getRoot() != NULL)
  {
    int size = sizeof(Leaf**);
    *((Leaf**)lua_newuserdata(L, size)) = tree->getRoot(); // allocate a pointer to a pointer
    lua_setmetatable(L, "MyStuff.Leaf");
  }
  else
  {
    lua_pushnil(L);
  }

  return 1;
}

いくつかのトラブルシューティングの後、期待どおりにツリー オブジェクトとリーフ オブジェクトを解放することができました。しかし、これまでのところ、ポインターポインターがクリーンアップされているという説得力のある方法を (少なくとも私には) 見つけていません。

私の質問は次のとおりです。Lua の lua_newuserdata() によって割り当てられたメモリが、Lua のガベージ コレクションによって自動的にクリーンアップされると安全に想定できますか?

4

2 に答える 2