在C++中删除我所有的Lua userdata。

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

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

正如你所看到的,首先我创建了一个对象并保存了指向C ++类Object的指针,该指针是使用“new”在我的map类中分配的。然后我删除了这个对象,这意味着我删除了map类中指针的分配内存。最后,我调用SetPosition,如果内存仍然分配给c ++ Object类,则一切都将运行良好。但是,如果它被删除(因为在SetPosition(...)调用之前我们调用了Delete()),我的程序将崩溃。所以,我在想以下事情:

是否可能通过调用Delete将变量'a'在lua中设置为nil?我知道我可以做类似'a = a:Delete()'的事情,如果Delete返回nil,但是如果我忘记做'a ='部分,它将失败。还想知道是否可以删除userdata并在调用SetPosition()时检查其是否不存在,如果不存在则返回。

此外,基础代码来自:[http://lua-users.org/wiki/SimpleCppBinding](http:/ /lua-users.org /wiki/SimpleCppBinding)。

原文链接 https://stackoverflow.com/questions/9168394

点赞
stackoverflow用户396583
stackoverflow用户396583
2012-02-06 22:51:46
stackoverflow用户734069
stackoverflow用户734069

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

能否通过调用 Delete 将 Lua 中的变量 'a' 设为 nil?

不行。没有办法做到你所说的事情。原因是:你正在尝试编写糟糕的代码。

Lua 是一种使用 垃圾回收 的系统。不应该期望 Lua 能够 删除 对象。如果 Lua 获得了某个外部对象的指针,那么要么你的代码拥有它,要么 Lua 拥有它。

如果你的代码拥有它,Lua 不应该删除它。Lua 可以在一段时间内使用它。但是,你的 Lua 代码必须在确切的时期内使用它,且只使用一次。一旦其生命周期已过期,Lua 就不应再与它交互了。

这与在 C 和 C++ 中处理指向对象的指针并没有任何区别。如果你的函数获得了一个裸指针(即:不是智能指针),你的代码需要知道它可以合理地期望与该对象交互的时间有多长。它可以存储吗?它可以存储多长时间该对象的指针?该对象什么时候会结束它的生命,谁负责销毁它?

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

当你给 Lua 一些现在属于它的东西时,它应该 看起来 像一个常规的 Lua 对象。你不需要为在 Lua 中创建的表和字符串调用 Delete 方法;你让垃圾收集器进行其工作。作为编写 C++ 到 Lua 接口的人,你的工作是确保你提供给 Lua 的对象以 Lua 希望的方式进行操作。

在需要进行重要资源管理的情况下,当你需要 Lua 尽快释放资源(例如文件句柄等)时,你需要将指向 C++ 对象的指针存储在非轻量级用户数据中。这是你要将其置为 NULL 的指针。所有关于该对象的接口函数将检查指针是否为 NULL,并简单地什么也不做或者引发一个错误。

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

2012-02-06 22:53:27
stackoverflow用户107090
stackoverflow用户107090

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

2012-02-06 22:59:11