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::vector<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
不再存在。那么调用者应该如何处理一个不存在的对象的地址呢? - David Schwartz