作成中のアプリケーションで 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 のガベージ コレクションによって自動的にクリーンアップされると安全に想定できますか?