我试图访问一个userdata的类型,以便我可以相应地处理它。想象我有一个命名为Foo类:Lua C++ userdata
class Foo:public CObject
{
public:
Foo():CObject(){}
int type() {return 1;}
}
class CObject
{
public:
virtual int type(void)=0;
}
的理由是,延伸的CObject的每一个类具有必须由通过的整数已知的类型(以后枚举)。 Foo类使用luaWwrapper绑定到lua(// https://bitbucket.org/alexames/luawrapper/src/fd9c4fdbf4b25034e3b8475a2c8da66b7caab427?at=default)。
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
的内存地址不一样。 I 假定ud
是指包含Foo
的存储器地址的堆栈的存储器。如何访问堆栈的内存地址或Foo
的首选内存地址?