作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 請問函式的引數若為另一函式,是否就不 …
時間Thu May 28 09:12:48 2009
首先,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