1

我想知道是否可以访问所有用户数据“表”(它是否称为用户数据表?)然后从 Lua 中删除它们,因为这是我的问题:

a = Object(5, 5)
a:Delete()
a:SetPosition(3,3)

正如您首先看到的,我创建了一个对象并保存了一个指向名为 Object 的 c++ 类的指针,该类在我的地图类中使用“new”分配。然后我删除对象,这意味着我删除了为地图类中的指针分配的内存。最后我调用 SetPosition,如果内存仍然分配给 c++ Object 类,那么一切都会很有趣。但是如果它被删除(在这种情况下是因为我们在 SetPosition(...) 调用之前调用了 Delete())我的程序将崩溃。所以我想知道的是:

是否可以通过调用 Delete 将 lua 中的变量 'a' 设置为 nil ?我知道如果 Delete 返回 nil,我可以执行类似 'a = a:Delete()' 的操作,但如果我忘记执行 'a =' 部分,它会失败。另外我想知道是否可以删除用户数据并在我调用 SetPositon() 时检查它是否不存在,如果不存在,我将返回。

此外,基本代码来自: http: //lua-users.org/wiki/SimpleCppBinding

4

3 回答 3

4

首先,让我回答你的问题:

是否可以通过调用 Delete 将 lua 中的变量 'a' 设置为 nil ?

不,没有办法按照你说的去做。这是有原因的:你试图做的是糟糕的代码。

Lua 是一个垃圾收集系统。不应期望 Lua删除对象。如果 Lua 得到一个指向某个外部对象的指针,那么要么你的代码拥有它,要么 Lua 拥有它。

如果你的代码拥有它,Lua 不应该删除它。Lua 可以使用它一段时间。但这取决于您的 Lua 代码是否准确且仅在该时间段内使用它。一旦它的生命周期结束,Lua 就不应该再和它说话了。

这与在 C 和 C++ 中处理指向对象的指针没有什么不同。如果您的函数被传递给一个裸指针(即:不是智能指针),您的代码需要知道它可以合理地期望与该对象对话多长时间。可以储存吗?它可以将指向该对象的指针存储多长时间?那个物体什么时候会死,谁负责摧毁它?

如果你将一个对象传递给 Lua 以使Lua现在拥有该对象,那么 Lua 也不应该显式地删除它。Lua 是一个垃圾收集系统;您应该将元方法附加__gc到您的类型,以便 Lua 的垃圾收集器在收集用户数据时调用您的代码。这样,您可以调用析构函数、释放内存等。

当你给 Lua 一些现在属于 Lua 的东西时,它应该看起来像一个普通的 Lua 对象。您不会Delete为在 Lua 中创建的表和字符串调用方法;你让垃圾收集器完成它的工作。作为编写 C++ 到 Lua 接口的人,你的工作是确保你提供给 Lua 的对象按照Lua想要的方式运行。

如果您需要进行重要的资源管理,希望 Lua 尽快释放资源(例如文件句柄等),那么您需要在非轻量级用户数据中存储指向 C++ 对象指针. 那是你 NULL 出来的指针。该对象上的所有接口函数都将检查指针以查看它是否为 NULL,并且什么也不做或引发错误。

Lua 的文件句柄(由 返回io.open)就是一个很好的例子。如果你试图在它们上调用函数,Lua 会抛出一个 Lua 错误。

于 2012-02-06T22:53:27.677 回答
3

Delete方法中,将接收到的对象的元表设置为,nil如果稍后调用该对象的方法,您将收到一条错误消息。

于 2012-02-06T22:59:11.903 回答
1

我宁愿建议使用SWIGLuaBind,他们已经为你处理了这些陷阱。

于 2012-02-06T22:51:46.867 回答