看板 C_and_CPP 關於我們 聯絡資訊
首先,auto_ptr 不管用,原因不只是 auto_ptr 不會呼叫 delete[], 而是它會讓 Mul 產生副作用。 為了使用 auto_ptr,我們必需把 matrix 包成一個 class class Matrix { int n; double **data; ... }; auto_ptr<Matrix> transpose(const Matrix& m); 問題來了,transpose() 回傳 auto_ptr,因此 Mul() 的參數勢必也 是 auto_ptr: auto_ptr<Matrix> Mul(auto_ptr<Matrix> a, auto_ptr<Matrix> b); 那當我們要寫 A * B' 的時候,顯然會產生副作用: Mul(auto_ptr<Matrix>(&a), transpose(b)); // 這樣寫對嗎? 你不能把 a 的位址轉成 auto_ptr 傳到 Mul 內部,因為 auto_ptr 會 取得所有權,執行完 Mul 後,a 會被解構!但你又不能單獨把 Mul() 的第一個參數改成 const Matrix&,因為你不知道使用者會不會在第一 個參數放 transpose() 得到的結果。 這個問題沒有快速又簡單的解法。最簡單的解法是 Mul() 和 transpose() 都回傳 Matrix (傳值),雖然會浪費多餘的時間去複製暫時變數,但不會 造成 memory leak 或 double free 的情況。如果需要良好的效能,可能 就需要搬出 expression template 來用了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.116.63
james732:原來如此 受教了 05/28 10:23
dcleft:推,傳值應會比傳vector好一些 05/28 12:06
dcleft:不過請問一下 "回傳 Matrix (傳值)" 是指傳double[][] ? 05/28 14:14
dcleft:還是傳什麼? 05/28 14:15
mantour:寫成一個class,然後把delete寫在destructor內 05/28 20:50