Re: [問題] 請問函式的引數若為另一函式,是否就不 …

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/05/28 09:12), 編輯推噓2(203)
留言5則, 3人參與, 最新討論串2/4 (看更多)
首先,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

05/28 10:23, , 1F
原來如此 受教了
05/28 10:23, 1F

05/28 12:06, , 2F
推,傳值應會比傳vector好一些
05/28 12:06, 2F

05/28 14:14, , 3F
不過請問一下 "回傳 Matrix (傳值)" 是指傳double[][] ?
05/28 14:14, 3F

05/28 14:15, , 4F
還是傳什麼?
05/28 14:15, 4F

05/28 20:50, , 5F
寫成一個class,然後把delete寫在destructor內
05/28 20:50, 5F
文章代碼(AID): #1A7UKI5R (C_and_CPP)
文章代碼(AID): #1A7UKI5R (C_and_CPP)