将一个拥有父类的Lua类存储在luabind::object中
2015-11-2 1:45:52
收藏:0
阅读:267
评论:2
使用 C++,lua 5.1,luabind 0.7-0.81
尝试创建具有父类的 lua 类,并将其存储在 luabind::object 中。
Lua
class 'TestClassParent'
function TestClassParent:__init()
print('parent init\n')
end
function TestClassParent:__finalize()
print('parent finalize\n')
end
class 'TestClass' (TestClassParent)
function TestClass:__init()
print('init\n')
TestClassParent.__init(self)
end
function TestClass:__finalize()
print('finalize\n')
end
C++
{
luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass");
}
printf("before GC\n");
lua_gc(lua, LUA_GCCOLLECT, 0);
printf("after GC\n");
Output:
init
parent init
before GC
after GC
结果: 在 obj 被销毁后,'TestClass' 实例虽然未经垃圾回收循环(__finalize 方法未被调用且内存未被释放)仍然存活,只有在程序退出时才会被销毁。
更糟糕的是,如果我使用无父类的类,则可以正确回收垃圾。
如果我尝试使用 adopt policy(使用它来拥有创建的对象)
luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)];
我会得到:
- 在 luabind 0.7 中 - 与未使用 adopt policy 相同的结果
- 在 luabind 0.81 中 - 崩溃并显示“您正在尝试使用未注册的类型”
我该如何正确地 在 C++ 中创建 lua 对象并拥有它?
原文链接 https://stackoverflow.com/questions/1939864
点赞
stackoverflow用户53249
这是 0.8.1 版本中已知的 bug;在 "super" 函数的 upvalue 中留下了对上一个构建的对象的引用。它已经在 0.9-rc1 中得到修复:
http://github.com/luabind/luabind/commit/2c99f0475afea7c282c2e432499fd22aa17744e3
2009-12-22 13:40:21
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
编辑:在 OP 的更新之后,这个答案已经不再相关了,但我还是把它留在这里。正确答案由 Daniel Wallin 提供。
并不是一个真正的答案,但我会用注释来失去格式
我无法复制这个。这是我使用的确切代码:
// 初始化 lua_State* lua = lua_open(); luaL_openlibs(lua); luabind::open(lua); // 声明类 luaL_loadstring(lua, "class 'TestClass'\ function TestClass:__init() print('init') end\ function TestClass:__finalize() print('finalize') end"); lua_pcall(lua, 0, LUA_MULTRET, 0); // 实例化 { luabind::object obj = luabind::call_function<luabind::object>(lua, "TestClass"); } // 收集 printf("Before GC collect\n"); lua_gc(lua, LUA_GCCOLLECT, 0); printf("After GC collect\n"); lua_close(lua);
我得到的结果是:
我使用 lua 5.1.4,luabind 0.81,VC8(也称为 VS2005) SP1。