通过其方法销毁Lua对象。
2012-7-6 9:7:37
收藏:0
阅读:175
评论:3
我想通过类的自己的方法来销毁类实例。例如:
obj = Object()
obj:destroy()
type(obj) == nil
Object 是基于 C 实现的。这是可能的吗?
如果不可能,第二种方法是:
_G["obj"] = nil
collectgarbage()
谢谢!
点赞
用户734069
我想通过其自身的方法来销毁类实例。
你应该尽可能避免这样做。仅在Lua中暴露显式析构函数若您绝对需要时。
正确处理方式是为Lua C对象分配元表,并在其中添加一个__gc元方法。这个元方法会在Lua进行垃圾回收之前调用。
如果您确实需要使用显式析构函数(因为您希望用户能够在完成后立即释放昂贵的资源,而不必等待垃圾回收),则需要做两件事:
不要_要求_用户显式销毁对象。即,对象可以通过销毁函数或垃圾回收函数销毁。
销毁对象时不要_破坏_它。每个使用这个对象(成员函数或自由函数)的函数需要在用户调用显式销毁函数时仍然可以使用。这些函数可以什么也不做,这是可以接受的。但程序不应当_崩溃_。
基本上,您的对象在被显式销毁时需要仍然保持“存活”状态。您需要让对象成为亡灵:存活但没有太多用处。这样,即使程序没有执行正确的操作,您的程序仍会正常运行。
2012-07-06 16:04:15
用户9216142
可以在对象内创建一个子表格作为私有数据存储,这在一定程度上是可行的。该子表格仅由对象管理,因此只能有一个引用。如果为对象定义析构方法,则会删除相应的子表格,使其有资格进行垃圾收集。当然,父表格仍将存在,只剩下不占据任何重要资源的方法。
这是否是“良好的设计”是主观的。我只是提供问题的一个解决方案。
2018-01-14 15:47:51
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
在你的示例中,简单的
obj = nil就足够了。 注意,您不需要销毁对象的内容,只需删除在变量obj中的引用,并使内存中真正的对象少一个引用。如果引用次数达到0,则无法引用并有资格进行GC。如果您的对象没有一些外部任务在销毁时执行,那就基本上需要这些了。 只需通过让它们超出范围或将包含这些引用的变量/表成员与其他内容或
nil覆盖来失去所有引用。否则,您需要首先调用特定于对象的析构函数,然后再删除引用。不可能使这样的析构函数自动从所有地方删除所有引用,但至少它可以清除对象的内部状态并设置一些内部标志,指示对象不再可用或准备好重新初始化。