【问题标题】:Storing a lua class with parent in luabind::object在 luabind::object 中存储带有父级的 lua 类
【发布时间】:2010-12-28 17:35:14
【问题描述】:

使用 C++lua 5.1luabind 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");

输出
初始化
父级初始化
GC之前
GC后

结果: obj 被销毁后,'TestClass' 实例在垃圾回收周期后仍然活着(__finalize 方法没有被调用,内存也没有被释放)。它只在程序退出时销毁。
Moresome如果我使用没有父级的类,垃圾会被正确收集。

如果我尝试使用 adopt policy(获取已创建对象的所有权)

luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)];

我明白了:

  • luabind 0.7 - 与没有采用策略的结果相同
  • luabind 0.81 - 崩溃并显示消息“您正在尝试使用未注册类型”

如何正确在 C++ 中创建一个 lua 对象获取它的所有权

【问题讨论】:

    标签: c++ scripting garbage-collection lua luabind


    【解决方案1】:

    编辑:在 OP 更新后,这个答案不再相关,不过我还是把它挂在这里。 Daniel Wallin 发布了正确答案

    不是一个真正的答案,但我会丢失带有评论的格式

    我无法复制这个。这是我使用的确切代码:

    // initialization
    lua_State* lua = lua_open();
    luaL_openlibs(lua);
    luabind::open(lua);
    // declare class
    luaL_loadstring(lua, 
        "class 'TestClass'\
         function TestClass:__init() print('init') end\
         function TestClass:__finalize() print('finalize') end");
    lua_pcall(lua, 0, LUA_MULTRET, 0);
    // instantiate
    {
        luabind::object obj = luabind::call_function<luabind::object>(lua, "TestClass");
    }
    // collect
    printf("Before GC collect\n");
    lua_gc(lua, LUA_GCCOLLECT, 0);
    printf("After GC collect\n");
    lua_close(lua);
    

    我得到的结果是:

    init
    Before GC collect
    finalize
    After GC collect
    

    我正在使用 lua 5.1.4,luabind 0.81 和 VC8(又名 VS2005)SP1

    【讨论】:

    • 非常感谢您的测试。你说得对。我对问题的描述不正确。只有当类有父级时它才是实际的。我已经更新了主帖中的描述。
    【解决方案2】:

    这是 0.8.1 中的一个已知错误;对最后一个构造对象的引用留在“超级”函数 upvalue 中。它已在 0.9-rc1 中修复:

    http://github.com/luabind/luabind/commit/2c99f0475afea7c282c2e432499fd22aa17744e3

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多