通过其方法销毁Lua对象。

我想通过类的自己的方法来销毁类实例。例如:

obj = Object()
obj:destroy()
type(obj) == nil

Object 是基于 C 实现的。这是可能的吗?

如果不可能,第二种方法是:

_G["obj"] = nil
collectgarbage()

谢谢!

点赞
用户936986
用户936986

在你的示例中,简单的obj = nil就足够了。 注意,您不需要销毁对象的内容,只需删除在变量obj中的引用,并使内存中真正的对象少一个引用。如果引用次数达到0,则无法引用并有资格进行GC。

如果您的对象没有一些外部任务在销毁时执行,那就基本上需要这些了。 只需通过让它们超出范围或将包含这些引用的变量/表成员与其他内容或nil覆盖来失去所有引用。否则,您需要首先调用特定于对象的析构函数,然后再删除引用。

不可能使这样的析构函数自动从所有地方删除所有引用,但至少它可以清除对象的内部状态并设置一些内部标志,指示对象不再可用或准备好重新初始化。

2012-07-06 12:35:45
用户734069
用户734069

我想通过其自身的方法来销毁类实例。

你应该尽可能避免这样做。仅在Lua中暴露显式析构函数若您绝对需要时。

正确处理方式是为Lua C对象分配元表,并在其中添加一个__gc元方法。这个元方法会在Lua进行垃圾回收之前调用。

如果您确实需要使用显式析构函数(因为您希望用户能够在完成后立即释放昂贵的资源,而不必等待垃圾回收),则需要做两件事:

  1. 不要_要求_用户显式销毁对象。即,对象可以通过销毁函数或垃圾回收函数销毁。

  2. 销毁对象时不要_破坏_它。每个使用这个对象(成员函数或自由函数)的函数需要在用户调用显式销毁函数时仍然可以使用。这些函数可以什么也不做,这是可以接受的。但程序不应当_崩溃_。

基本上,您的对象在被显式销毁时需要仍然保持“存活”状态。您需要让对象成为亡灵:存活但没有太多用处。这样,即使程序没有执行正确的操作,您的程序仍会正常运行。

2012-07-06 16:04:15
用户9216142
用户9216142

可以在对象内创建一个子表格作为私有数据存储,这在一定程度上是可行的。该子表格仅由对象管理,因此只能有一个引用。如果为对象定义析构方法,则会删除相应的子表格,使其有资格进行垃圾收集。当然,父表格仍将存在,只剩下不占据任何重要资源的方法。

这是否是“良好的设计”是主观的。我只是提供问题的一个解决方案。

2018-01-14 15:47:51