C++ C++;Lua用户数据与Mathfu浮点值混淆

C++ C++;Lua用户数据与Mathfu浮点值混淆,c++,vector,lua,C++,Vector,Lua,我试图使用Lua中的Mathfu::Vector来创建向量,但是当我试图从堆栈中检索用户数据时遇到了一个问题 下面是我用来定义用户数据的函数 static int vec4(lua_State*L) { 常量浮点x=luaL_校验号(L,1); 常量浮点y=luaL_校验号(L,2); 常量浮点数z=luaL_校验数(L,3); 常量浮点数w=luaL_校验数(L,4); 向量向量向量(x,y,z,w); *静态浇铸( lua_newuserdata(L,sizeof(mathfu::Vecto

我试图使用Lua中的Mathfu::Vector来创建向量,但是当我试图从堆栈中检索用户数据时遇到了一个问题

下面是我用来定义用户数据的函数

static int vec4(lua_State*L)
{
常量浮点x=luaL_校验号(L,1);
常量浮点y=luaL_校验号(L,2);
常量浮点数z=luaL_校验数(L,3);
常量浮点数w=luaL_校验数(L,4);
向量向量向量(x,y,z,w);
*静态浇铸(
lua_newuserdata(L,sizeof(mathfu::Vector*))=&vec;
luaL_setmetatable(L,VECTOR_LIB_NAME);
返回1;
}
我有一个函数,它根据一个
self
值和一个参数(都是userdata)得到两个向量的点积

静态int点向量(lua_State*L)
{
mathfu::Vector*vecA=*static_cast(luaL_checkudata(L,1,Vector_LIB_NAME));
mathfu::Vector*vecB=*static_cast(luaL_checkudata(L,2,Vector_LIB_NAME));
LOGI(“A:%f,%f,%f”,vecA->x,vecA->y,vecA->z);
LOGI(“B:%f,%f,%f”,vecB->x,vecB->y,vecB->z);
浮点点=mathfu::向量::点积(*vecA,*vecB);
lua_pushnumber(L,dot);
返回1;
};
从lua打来的电话

localveca=vec4(1,2,3,4)
局部vecB=vec4(5,6,7,8)
vecA:dot(vecB)
但是打印出来的值非常疯狂,就像将坏数据转换成浮点一样

A: -8055257885499399810754615288266752.000000, 0.000000, 0.000000
B: 0.000000, 3746318080.000000, 3573.204346

我已经检查了堆栈,前两个元素肯定是UserData,但我似乎无法深入挖掘用户数据。C++中的VARS包含这些值,但我对可能导致此值的情况感到茫然。非常确定userdata不是我期望的那样。这最终证明是件愚蠢的事情,使用
&
引用似乎是获取对象指针的错误方法。我把向量初始化代码改为

static int vec4(lua_State*L)
{
常量浮点x=luaL_校验号(L,1);
常量浮点y=luaL_校验号(L,2);
常量浮点数z=luaL_校验数(L,3);
常量浮点数w=luaL_校验数(L,4);
*静态浇铸(
lua_newuserdata(L,sizeof(mathfu::Vector*))=新的mathfu::Vector(x,y,z,w);;
luaL_setmetatable(L,VECTOR_LIB_NAME);
返回1;
}

我认为这一切都是可行的,因为当我使用
new
时,它会给我一个“实际”的指针地址,而不是一个引用?活到老学到老。

不,你没有内存泄漏。第一个版本是指向堆栈分配对象(&vec)的指针,该对象在函数结束后将被销毁。 第二个版本(新的mathfu::Vector)在堆上正确创建。。。我猜你以后再也不会删除它了=内存泄漏

还应尽量避免指针的静态转换。或任何强制铸造。这将增加问题,例如,如果g++将使用“严格别名”(由-O3隐式表示),那么任何指针强制转换都将被破坏。“严格别名”假设1个内存块从未被不同类型的指针指向。或者,您应该显式地配置编译器以避免出现这种情况。 一般的好主意是使用memcpy。编译器正确地理解并优化它。例如,如果希望指针作为指向int32的字符:

int32 a; 
char b[sizeof(a)]; 
memcpy(b, &a, sizeof(a));
现在用b代替

static_cast<char*>(&a);
static_cast(&a);