当类被删除/垃圾回收时调用函数。
2015-7-4 20:5:56
收藏:0
阅读:122
评论:3
我有一个类,在它的构造函数中打开一个 sqlite 数据库。是否有一种方式,使得它在被销毁时关闭数据库(无论是程序员销毁它还是被 Lua 垃圾回收销毁)?
到目前为止的代码:
local MyClass = {}
local myClass_mt= {__index=MyClass, __gc=__del}
function DBHandler.__init()
-- constructor
local newMyClass = {
db = sqlite3.open(dbPath)
}
return setmetatable(newMyClass , myClass_mt)
end
local function __del()
self.db.close()
end
点赞
用户1442917
您没有提到使用的 Lua 版本,但在 Lua 5.1 中,__gc 在表中无法使用。这样的话,可能会有用(它使用 Lua 5.1 的 newproxy hack):
m = newMyClass
if _VERSION >= "Lua 5.2" then
setmetatable(m, {__gc = m.__del})
else
-- keep sentinel alive until 'm' is garbage collected
m.sentinel = newproxy(true)
getmetatable(m.sentinel).__gc = m.__del -- careful with `self` in this case
end
对于 Lua 5.2,这与您拥有的代码没有区别;您没有说出到底出了什么问题,但 Egor 对于 self.db:close 的建议值得检查...
2013-04-27 23:09:33
用户2328533
对于你的特定情况,根据其 源代码,LuaSQLite 在销毁时已经关闭其句柄:
/* close method */
static int db_close(lua_State *L) {
sdb *db = lsqlite_checkdb(L, 1);
lua_pushnumber(L, cleanupdb(L, db));
return 1;
}
/* __gc method */
static int db_gc(lua_State *L) {
sdb *db = lsqlite_getdb(L, 1);
if (db->db != NULL) /* ignore closed databases */
cleanupdb(L, db);
return 0;
}
但是我认为,在 GC 上释放此类资源应该是备用解决方案:你的对象可能在相当长的时间后才能 GC,因此 SQLite 句柄将在此期间保持打开状态。一些语言提供了机制,尽早释放未管理的资源,例如 Python 的 with 或 C# 的 using。
不幸的是,Lua 没有提供这样的特性,因此你应该在可能的情况下自行调用 close,例如在你的类上添加一个 close 方法。
2013-04-28 07:28:12
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
在手册中寻找
finalizer链接。