Lua - 类析构函数的延迟调用。
2012-4-11 14:24:33
收藏:0
阅读:89
评论:1
我正在开发一款 C++ 程序,该程序实际上只是执行了一个 Lua 脚本。在 Lua 脚本中,我导出了从我的 C++ 程序中构造的类。
我的 main()
C++ 函数在一些准备后调用了以下内容...
luabind::call_function<void>(m_L, "main");
现在我的 Lua 脚本如下所示:
local function test()
local c = C()
end
function main()
for i=1,2 do
log(i)
test()
end
end
我在 C 的析构函数中包含了 std::cout << "destructor" << std::endl;
,以便我知道何时调用它。我期望 Lua 的垃圾回收器在每次 test() 执行结束时调用 c 的析构函数,因为那时它已经超出了其范围。但实际输出如下:
1
2
destructor
destructor
而不是
1
destructor
2
destructor
有没有人知道为什么会这样呢?我漏掉了什么吗?
原文链接 https://stackoverflow.com/questions/10107917
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我期望当执行 test() 结束并且超出作用域时,lua的垃圾回收会调用c的析构函数,因为那时对象已经不被使用。
然而实际情况并非如此。Lua的垃圾回收不会在每个作用域的结束时运行。在垃圾回收语言中,不能确定对象析构的具体时间。在一些语言中甚至可能永远不会被销毁。
无法使Lua自动确定性地销毁对象,就像C++一样。
如果你依靠对象的确定性销毁,可以使用Lua的
collectgarbage
函数,但最好是根据实际情况重新设计你的代码。这是 Lua文档中垃圾回收的具体实现。
下面是一个使用
collectgarbage
的例子:local function test() local c = C() end function main() for i=1,2 do log(i) test() collectgarbage "collect" end end