【发布时间】: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
}
我看到程序崩溃导致Foo和ud的内存地址不一样。我假设 ud 指的是堆栈的内存,其中包含Foo 的内存地址。如何访问堆栈的内存地址或Foo的首选内存地址?
【问题讨论】: