5

假设我有这样的课程:

class A
{
public:
A(){}
~A(){}
};

并通过 Luabind 将其暴露给 Lua,如下所示:

module(luaState) 
    [
        class_<A>("Foo")
        .def(constructor<>())
    ];

最后在这样的脚本中实例化它:

A = Foo();

那时 A 的实际“存在状态”是什么?

它是在堆中的某个地方,lua 在某处保留了对它的引用吗?(或 luabind::object?)

我有一种感觉,它只能是一个指针,例如,由 new 或等价物分配。

但是,我可以将函数绑定到接受引用的 lua,比如lua_doSomething(A & a)最终的引用将是一个实际的引用。当然,我知道这很可能只是 luabind 传递a*a,但我不知道它是否是这样发生的。

我问这个的原因是为了更好地理解和预测在脚本中实例化的对象的生命周期。

那,我不确定所有权或生命周期是否会改变,而不是像上面那样将类暴露给 lua,而是这样做:

A * lua_CreateA()
{
return new A();
}

module(luaState) 
    [
        class_<A>("Foo")
    ];


module(luaState)
    [

    def("createA",&lua_CreateA)

    ];

并像使用它一样

A = createA();

根据我目前理解的逻辑,这种情况需要我进行清理,因为我是分配新对象的人,除非像这样的 luabind 分配与使用绑定的构造函数相同。

简而言之,我真的很困惑对象的生命周期和这里的东西......我搜索了与此相关的关键字,但我只得到像 http://www.gamedev.net/topic/525692-luabind这样的东西-所有权和销毁/

这不是我真正想知道的。我想了解在分配、实例化、生命周期等方面如何在幕后处理事情的具体方式。

4

1 回答 1

5

使用 Luabind 对象的生命周期非常简单。您无需了解 Luabind 在内部执行的操作的血腥细节即可获得它。

Lua 直接拥有由Lua创建的对象。因此,如果您在 Lua 中使用构造函数语法分配对象,则该对象归 Lua 所有。当 Lua 中不再引用该对象时,Lua GC 将收集它。

如果 Lua 通过任何其他方式获得对某个对象的引用,则 Lua 不拥有该对象,除非您使用 Luabind 的采用策略明确转移所有权。因此,如果你绑定了一个返回对象给 Lua 的函数,这样你现在期望 Lua 决定该对象何时存活,那么你需要使用采用策略。

最后一段仅适用于实际引用(返回指针和引用类型)。如果 Lua 获得了一个对象的副本(通过非引用或指针返回值),那么 Lua 将拥有该对象的副本

于 2011-08-14T20:23:40.400 回答