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

标签 c++ vector lua

我正在尝试使用 Lua 中的 Mathfu::Vector 创建 vector ,但是当我尝试从堆栈中检索用户数据时遇到问题。

这是我用来定义用户数据的函数

static int vec4(lua_State *L)
{
  const float x = luaL_checknumber(L, 1);
  const float y = luaL_checknumber(L, 2);
  const float z = luaL_checknumber(L, 3);
  const float w = luaL_checknumber(L, 4);

  mathfu::Vector<float, 4> vec(x, y, z, w);
  *static_cast<mathfu::Vector<float, 4> **>(
      lua_newuserdata(L, sizeof(mathfu::Vector<float, 4> *))) = &vec;
  luaL_setmetatable(L, VECTOR_LIB_NAME);

  return 1;
}

我有一个函数可以根据 self 获取两个 vector 的点积。值和参数(都是用户数据)

static int dotVector(lua_State *L)
{
  mathfu::Vector<float, 4> *vecA = *static_cast<mathfu::Vector<float, 4> **>(luaL_checkudata(L, 1, VECTOR_LIB_NAME));
  mathfu::Vector<float, 4> *vecB = *static_cast<mathfu::Vector<float, 4> **>(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);
  float dot = mathfu::Vector<float, 4>::DotProduct(*vecA, *vecB);
  lua_pushnumber(L, dot);

  return 1;
};

从lua调用

local vecA = vec4(1, 2, 3, 4)
local 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++ 中的变量包含这些值,但我不知道是什么原因造成的。很确定用户数据不是我期望的那样。

最佳答案

不,您确实发生了内存泄漏。第一个版本是指向堆栈分配对象(&vec)的指针,一旦函数结束,它就会被销毁。
第二个版本(新的 mathfu::Vector)在堆上正确创建......我猜你以后永远不会删除它 = 内存泄漏。

还要尽量避免指针的 static_cast。或任何强制施法。这会增加问题,例如如果 g++ 将使用“严格别名”(由 -O3 隐含),那么任何指针转换都将被破坏。 “严格别名”假设 1 个内存块从未被不同类型的指针指向。或者您应该显式配置编译器以远离它。
一般的好主意是使用memcpy。编译器正确理解和优化它。例如,如果您希望将指针作为 char 指向 int32:

int32 a; 
char b[sizeof(a)]; 
memcpy(b, &a, sizeof(a));

现在改用 b
static_cast<char*>(&a);

关于C++ Lua用户数据与Mathfu浮点值混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60278177/

相关文章:

c++ - 为什么需要在类之外定义静态数据成员?

c++ - 我不断收到相同的错误消息 : Segment Fault (core dumped)

c++ - std::vector 构造函数中的 bad_alloc

class - 'o = o or {}'在Lua中做什么?

Lua类不工作

c++ - SubsetSum 打印列表

c++ - 对 `vtable 的 undefined reference (最小示例)

c++ - 使用 vector 创建二维数组

objective-c - iPhone 上的 Lua-Objective-C 桥

c++ - 类中的指针与变量