c++里,函數返回一個局部數組名可以嗎?

Quaternion這個類裡面定義了 x y z w,裡面有個函數如下:

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;
}

可是這個 tmp1 在函數結束的時候不是被釋放了嗎? 難道不應該用new嗎?為什麼這個程序可以正常運行?

源碼在這裡 :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?

TAG:編程語言 | 編程 | C | 函數 | CC |