c++ - 需要帮助了解 luabind 如何实例化类

标签 c++ lua allocation object-lifetime luabind

假设我有这样一个类:

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

然后像这样通过 Luabind 将其暴露给 Lua:

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

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

A = Foo();

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

它是否在堆中的某处,并且 lua 在某处保留了对它的引用? (或 luabind::object?)

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

但是,我可以将函数绑定(bind)到接受引用的 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 赋值与使用绑定(bind)构造函数执行的赋值相同。

简而言之,我对对象生命周期和这里的东西真的很困惑...... 我用谷歌搜索了与此相关的关键字,但我只得到类似的东西 http://www.gamedev.net/topic/525692-luabind-ownership-and-destruction/

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

最佳答案

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

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

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

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

关于c++ - 需要帮助了解 luabind 如何实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7059426/

相关文章:

c++ - 奇怪的 C++ 性能差异?

android - 行触摸了 id 名称为 "Corona SDK"的 gotoScene

Java对象未访问变量的内存分配

iphone - 仪器如何自动停止工作?

algorithm - 可能是NP完全问题?

c++ - 关于 C++ 模板和显式声明

c++ - 为什么我不能有一个纯虚拟赋值运算符?

c++ - argc 和 argv 的目的是什么?

graphics - Love2D 中网格上的奇怪纹理行为,需要帮助才能达到我期望的结果

multithreading - Lua channel 和多核支持 : Can it be done?