Lua / Luabind:由对象构造的对象保持分配状态

时间:2014-01-16 14:37:40

标签: c++ lua luabind

我有一个简单的Lua脚本

function TestFunction(Id)
    local Factory = TestParent();
    local ChildDirect = TestChild("DirectCall");
    local ChildFactory1 = Factory:CreateChild("Factory1");
    local ChildFactory2 = Factory:CreateChild("Factory2");

    result = Ret()
    return result
end

使用两个C ++公开的对象(通过luabind

void TestParent::RegisterToLua(lua_State* lua)
{
  // Export our class with LuaBind
  luabind::module(lua) 
    [
        luabind::class_<TestParent>("TestParent")
            .def(luabind::constructor<>())
            .def("CreateChild", &TestParent::CreateChild)
    ];
}

void TestChild::RegisterToLua(lua_State* lua)
{
  // Export our class with LuaBind
  luabind::module(lua) 
    [
        luabind::class_<TestChild>("TestChild")
            .def(luabind::constructor<std::string>())
            .def("GetValue", &TestChild::GetValue)
    ];
}

我调用了函数

luabind::object obj = luabind::call_function< luabind::object >(LuaState, "TestFunction", IdParam);

if ( obj.is_valid() )
{
        ....
}

lua_gc(LuaState, LUA_GCCOLLECT, 0);

lua_gc来电期间,仅FactoryChildDirect个对象被销毁。 ChildFactory1ChildFactory2仍然分配。 lua堆栈在luabind::call_function之后保持平衡(具有相同的值 - 5 - 一些表)。

有什么问题? Factory创建的对象仍以某种方式引用?由谁?

CreateChild正文是

TestChild* TestParent::CreateChild(std::string strname)
{
    return new TestChild(strname);
}

新构造对象的所有权应由lua对象获取,并在ChildFactory1或ChildFactory2为nil时被销毁或超出范围。

2 个答案:

答案 0 :(得分:1)

您应该从工厂返回智能指针(即boost::shared_ptr)。

见:LuaBind Documentation # smart pointer

以及LuaBridge docu

中的讨论

答案 1 :(得分:1)

adopt:用于跨语言边界转移所有权。

module(L)
[
    def("create", &create, adopt(result))
];