float angles[3] = { ... };
定义了一个本地数组。
声明
return angles;
指针返回到该阵列的第一个元素。
但是,只要函数返回,数组就会被破坏。因此,返回的指针是一个悬挂指针。
这就是编译器警告你的。如果您在调用函数中取消引用了返回的指针,则会调用未定义的行为。
为了返回一个指针数组将保持在函数返回后有效,你需要动态分配内存,并返回动态内存。
float* Creature::eulerAngles(const float &q0, const float &q1,
const float &q2, const float &q3)
{
float* angles = new float[3];
angles[0] = atan2(2 * (q0*q1 + q2*q3), 1 - 2 * (q1*q1 + q2*q2));
angles[1] = asin(2 * (q0*q2 - q3*q1));
angles[2] = atan2(2 * (q0*q3 + q1*q2), 1 - 2 * (q2*q2 + q3*q3));
return angles;
}
请记住,如果你做了以上,你就必须确保调用delete []
在调用函数返回的指针。
为了避免手动分配和释放内存,你可以使用std::vector<float>
为您的返回类型的麻烦。
std::vector<float> Creature::eulerAngles(const float &q0, const float &q1,
const float &q2, const float &q3)
{
std::vector<float> angles(3);
angles[0] = atan2(2 * (q0*q1 + q2*q3), 1 - 2 * (q1*q1 + q2*q2));
angles[1] = asin(2 * (q0*q2 - q3*q1));
angles[2] = atan2(2 * (q0*q3 + q1*q2), 1 - 2 * (q2*q2 + q3*q3));
return angles;
}
由此,内存管理自动完成。
由于阵列的尺寸固定为3,使用std::array<float, 3>
比使用std::vectro<float>
更好:
std::array<float, 3> Creature::eulerAngles(const float &q0, const float &q1, const float &q2, const float &q3)
{
std::array<float, 3> angles;
angles[0] = atan2(2 * (q0*q1 + q2*q3), 1 - 2 * (q1*q1 + q2*q2));
angles[1] = asin(2 * (q0*q2 - q3*q1));
angles[2] = atan2(2 * (q0*q3 + q1*q2), 1 - 2 * (q2*q2 + q3*q3));
return angles;
}
错误消息是相当清楚的。你将返回'angles'的地址,但是在你返回之后,'angles'不再存在。那么调用者应该如何处理不再存在的对象的地址? –
好吧,感谢清理东西:) – Jade