作者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
1F:→ james732:原来如此 受教了 05/28 10:23
2F:推 dcleft:推,传值应会比传vector好一些 05/28 12:06
3F:推 dcleft:不过请问一下 "回传 Matrix (传值)" 是指传double[][] ? 05/28 14:14
4F:→ dcleft:还是传什麽? 05/28 14:15
5F:→ mantour:写成一个class,然後把delete写在destructor内 05/28 20:50