Re: [問題] 請問函式的引數若為另一函式,是否就不 …
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間16年前 (2009/05/28 09:12)推噓2(2推 0噓 3→)留言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
05/28 12:06, 2F
推
05/28 14:14, , 3F
05/28 14:14, 3F
→
05/28 14:15, , 4F
05/28 14:15, 4F
→
05/28 20:50, , 5F
05/28 20:50, 5F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章