c++ - Lua C++ 用户数据

标签 c++ lua

我正在尝试访问用户数据的类型,以便我可以相应地处理它。假设我有一个名为 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) 绑定(bind)到 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++ 函数,比如打印:

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 的首选内存地址?

最佳答案

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

行内的事

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

关于c++ - Lua C++ 用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30960986/

相关文章:

c++ - 帮助解释探查器结果 [STL]

character-encoding - Lua String 字符编码

c++ - 使用过剩显示时遇到问题

lua - 使用 LPeg 使 Lua 模式不区分大小写

lua - 如何使用 lua 关键字作为表键?

lua - 如何处理没有 coroutine.yield() 的 Lua 库?

luaL_loadfile()可以用luaL_loadbuffer()代替吗?

c++ - C++ 客户端中的 WSAGetLastError 10038

c++ - C++文件加载期间的UTF8加扰

c++ - 如何让 CImg 库为 Qt 工作