我正在尝试访问用户数据的类型,以便我可以相应地处理它。假设我有一个名为 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
我看到程序崩溃导致Foo
和ud
的内存地址不一样。我假设 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/