我在我正在编写的应用程序中使用 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;
}
经过一些故障排除后,我能够在您期望的时候释放我的 Tree 和 Leaf 对象。但是到目前为止,我还没有找到一种令人信服的方法(至少对我来说)指针指针正在被清理。
我的问题是:我可以安全地假设 Lua 的 lua_newuserdata() 分配的内存会被 Lua 的垃圾收集自动清理吗?