用C ++删除我的所有Lua用户数据

时间:2012-02-06 22:37:50

标签: c++ pointers lua lua-userdata

我想知道是否可以访问所有userdata“表”(它叫做userdata表吗?)然后从Lua删除它们,因为这是我的问题:

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

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

是否可以通过调用Delete将lua中的变量'a'设置为nil为nil?我知道如果删除返回nil我可以做'a = a:Delete()'这样的事情,但是如果我忘了做'a ='部分就失败了。另外我想知道是否可以删除userdata并检查它是否在我调用SetPositon()时不存在,如果不存在我将返回。

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

3 个答案:

答案 0 :(得分:4)

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

  

是否可以通过调用Delete?

将lua中的变量'a'设置为nil

没有。没有办法做你所说的。这是有原因的:你要做的就是糟糕的代码。

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

如果您的代码拥有它,Lua不应该删除它。 Lua可以使用一段时间。但是由Lua代码完全使用它并且仅在那段时间内使用它。一旦它的生命周期到期,Lua就不应再和它说话了。

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

如果你将一个对象传递给Lua,使 Lua 现在拥有该对象,Lua也不应该明确地删除它。 Lua是垃圾收集系统;你应该在你的类型中附加一个__gc metamethod,这样Lua的垃圾收集器会在收集用户数据时调用你的代码。这样,你可以调用析构函数,空闲内存等。

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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