需要帮助理解luabind如何实例化类
Need help understanding how luabind instantiates classes
假设我有一个这样的类:
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)
,最终在那里将是一个实际的引用。当然,我知道这很可能只是将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-ownership-and-destruction/
这不是我真正想知道的。
对象生命周期在Luabind中非常简单。你不需要了解Luabind内部工作的血腥细节来获得它。
Lua拥有由 Lua直接创建的对象。如果你用Lua中的构造函数语法分配一个对象,那个对象是Lua拥有的。当对象在Lua中不再被引用时,Lua GC将收集它。
如果Lua通过任何其他方式获得对对象的引用,那么Lua不拥有该对象,除非您使用Luabind的adopt策略明确地转移所有权。因此,如果您绑定了一个返回对象给Lua的函数,那么您现在希望Lua决定该对象是活的还是死的,那么您需要使用adopt策略。
最后一段只适用于实际引用(返回指针和引用类型)。如果给Lua一个对象的副本(通过非引用或指针返回值),那么Lua将拥有该对象的副本。
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 使用Luabind实例化lua类
- 需要帮助理解luabind如何实例化类