c++里,函數返回一個局部數組名可以嗎?
Quaternion這個類裡面定義了 x y z w,裡面有個函數如下:
可是這個 tmp1 在函數結束的時候不是被釋放了嗎? 難道不應該用new嗎?為什麼這個程序可以正常運行?
float * Quaternion::getMatrix()
{
float temp1[16] = {
w*w + x*x - y*y - z*z, 2*x*y + 2*w*z, 2*x*z - 2*w*y, 0,
2*x*y - 2*w*z, w*w - x*x + y*y - z*z, 2*y*z + 2*w*x, 0,
2*x*z + 2*w*y, 2*y*z - 2*w*x, w*w - x*x - y*y + z*z, 0,
0, 0, 0, w*w + x*x + y*y + z*z
};
return temp1;
}
源碼在這裡 :Flight/Quaternion.cpp at master · ajbeach2/Flight · GitHub
返回局部變數的指針是錯誤的,運行結果不確定。可能有些平台上,在某些使用程況下可過關,但其他情況會出錯。
加上static可確保運行結果,但這函數仍然是不可重入(non-reentrant)。考慮以下代碼:func(q1.getMatrix(), q2.getMatrix());
函數func()獲取的矩陣總是相同的。不可重入也意味著非線程安全。
正確的做法是回傳一個Matrix對象(不是引用或指針),通過RVO一般能避免copy construction的開銷。
建議你submit issue或pull request。肯定不行啊跳出來之後就沒了
我又看了下作者的源碼,發現在那個函數上面有句注釋:
this matrix can be direclty pushed on the opengl matrix stack
這個矩陣可以立即被壓入到opengl的矩陣棧中所以,按照我的理解,作者這樣寫好像是可以的。在該函數調用結束後,temp1處的內存還沒有被破壞,立刻把temp1處的數據處理掉就可以生命周期已經結束,無法獲得。
推薦閱讀:
※C++中String問題?
※請問我該注重學習Linux哪個方面?
※python調用CC++的方法各有什麼優勢,哪個最好?
※我寫C++喜歡用繼承有問題么?
※github 上有哪些遊戲或者遊戲開發相關的炫酷的user或者repo?