【问题标题】:Need help understanding how luabind instantiates classes需要帮助了解 luabind 如何实例化类
【发布时间】:2011-10-26 22:18:00
【问题描述】:

假设我有这样的课程:

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 &amp; a),最终会有一个实际的引用。 当然,我知道这很可能只是将 a 传递为 *a 的 luabind,但我不知道是不是这样。

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

那,我不确定所有权或生命周期是否会改变,而不是像上面那样将类暴露给 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-ownership-and-destruction/

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

【问题讨论】:

    标签: c++ lua allocation object-lifetime luabind


    【解决方案1】:

    使用 Luabind,对象的生命周期非常简单。您无需了解 Luabind 内部所做的血腥细节即可获得它。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多