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