我上了这堂课:
int x;
int y;
int **mat;
MyMatrix::MyMatrix(int a, int b)
:x(a), y(b)
{
int i ,j;
mat = new int*[x];
for (int i = 0; i < x; ++i)
mat[i] = new int[y];
for (i = 0; i < x; ++i){
for (j = 0; j < y; ++j){
mat[i][j] = i + j;
}
}
}
MyMatrix& MyMatrix::add(MyMatrix m){
int i, j;
if (x != m.x || y != m.y) return *this;
for (i = 0; i < x; ++i){
for (j = 0; j < y; ++j){
mat[i][j] += m.mat[i][j];
}
}
return *this;
}
MyMatrix::~MyMatrix()
{
for (int i = 0; i < x; ++i)
delete[] mat[i];
delete mat;
}
这是我的主要:
int main(){
MyMatrix m(2, 3);
MyMatrix m1(2, 3);
m.add(m1);
m.print();
}
一切正常,并打印出正确的答案,但是存在一些分配问题。我正在使用调试器,看到程序在第二次崩溃时两次进入析构函数。
请向我解释问题出在哪里,为什么?
是,当您调用m.add
参数时,将按值传递它,因此将在方法的入口处构建一个新矩阵,然后在末尾销毁该矩阵。要消除这种影响,请使用by-ref传递:
MyMatrix& MyMatrix::add(const MyMatrix &m){
...
}
这种方式将原始代码传递到函数中,但是const
阻止您在方法执行期间对其进行修改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句