【问题标题】:Lua C++ userdataLua C++ 用户数据
【发布时间】:2015-06-21 03:24:06
【问题描述】:

我正在尝试访问用户数据的类型,以便我可以相应地处理它。假设我有一个名为 Foo 的类:

class Foo:public CObject
{
 public:
 Foo():CObject(){}
 int type() {return 1;}
}

class CObject
{
 public:
 virtual int type(void)=0;
}

基本原理是每个扩展 CObject 的类都有一个类型,该类型必须通过整数(稍后在枚举中)来识别。 Foo 类使用 luaWwrapper (//https://bitbucket.org/alexames/luawrapper/src/fd9c4fdbf4b25034e3b8475a2c8da66b7caab427?at=default) 绑定到 lua。

  Foo* Foo_new(lua_State* L)
  {
    Foo* f=new Foo();
    lua_newuserdata(L,sizeof(f));
    std::cout<<"f="<<f;
    return f;
  }

在 Lua 中,用户将其称为:

f=Foo.new() 
print(f)

现在我有一个 C++ 函数,比如 print:

int lua_print(lua_State* L)
{
   void *ud = luaL_checkudata(L, 1, "Foo"); //ud is not zero
    std::cout<<"ud="<<ud;
    CObject* obj=(CObject*)ud;  //Casting to CObject
   int objtype=obj->type();   //program CRASHES here

}

我看到程序崩溃导致Fooud的内存地址不一样。我假设 ud 指的是堆栈的内存,其中包含Foo 的内存地址。如何访问堆栈的内存地址或Foo的首选内存地址?

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    你必须使用placement new来初始化lua_newuserdata返回的内存中的对象

    有些东西

    void *ud = lua_newuserdata(L,sizeof(Foo));
    new (ud) Foo();
    

    【讨论】:

      【解决方案2】:

      Foo_new 应该只返回指向对象的指针。

      换句话说,你的 Foo_new 应该是这样的:

      Foo* Foo_new(lua_State* L)
      {
        return new Foo();
      }
      

      但是,如果你不需要做特殊的初始化,你甚至不需要编写这个函数。如果你自己不写,这个功能是由神奇的模板提供给你的。

      当你想从 Lua 状态获取 Foo 对象时,你可以这样做:

      int lua_print(lua_State* L)
      {
         Foo *ud = luaW_to<Foo>(L, 1); //ud is not zero
         std::cout<<"ud="<<ud;
         CObject* obj=(CObject*)ud;
         int objtype=obj->type();
      }
      

      如果CObject 也注册了 LuaWrapper,你甚至不需要手动转换。你可以做luaW_to&lt;CObject&gt;(L, 1);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 2010-10-18
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多