关于c++动态建立二维数组和运算符重载的有关问题

关于c++动态建立二维数组和运算符重载的问题
本人菜鸟,下面的代码有问题实在找不出来,哪位大神帮帮我~
以下是部分代码:
//运算符重载实现矩阵加法
#include<iostream.h>
using namespace std;
class Matrix
{
public:
Matrix(int mm, int nn)
{
m=mm;n=nn;
  int i;
data=new double*[mm];//动态建立二维数组
for(i=0;i<mm;i++)
data[i]=new double[nn];
} //构造M行N列的矩阵
~Matrix()//析构函数释放data
{
for(int i=0;i<m;i++)
delete []data[i];//就是这里有问题,烦死我了
  delete []data;
}
Matrix operator + (Matrix &m2);//运算符重载实现矩阵加法
void display()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<data[i][j]<<" ";
}
cout<<endl;
}
}
void input()
{
cout<<"请输入矩阵的数据:"<<endl;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
cin>>data[i][j];
}
}
private:
double **data;
int m,n;//矩阵的行数,列数
};//类定义结束
Matrix Matrix::operator +(Matrix &m2)
{
Matrix m3(this->m,this->n);
if(this->m!=m2.m||this->n!=m2.n) {cout<<"矩阵不匹配"<<endl; exit(0);}
int i,j;
  for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
  m3.data[i][j]=this->data[i][j]+m2.data[i][j];
}
return m3;
}
int main(int argc, char* argv[])
{
int a,b,c,d;
cout<<"请输入第一个矩阵的行数和列数:"<<endl;
cin>>a>>b;
Matrix A(a,b);
A.input();
A.display();
  cout<<"请输入第二个矩阵的行数和列数:"<<endl;
cin>>c>>d;
Matrix B(c,d);
B.input();
B.display();
  Matrix C(a,b);//可以改为Matrix C,但是还得在类中加不带参的构造函数
  C=A+B;
  C.display();
return 0;
}
代码运行后没有error,但是数组输入完毕后系统就崩溃了,debug后发现是析构函数delete那部分有问题,可是我就是不会改,麻烦大神们帮我看看。

------解决方案--------------------
Matrix Matrix::operator +(Matrix &m2)
{
Matrix m3(this->m,this->n);//在栈中新建
if(this->m!=m2.m||this->n!=m2.n) {cout<<"矩阵不匹配"<<endl; exit(0);}
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
m3.data[i][j]=this->data[i][j]+m2.data[i][j];
}
return m3;//当返回m3时,m3是返回了,但是因为是在栈中新建的,所以当函数退出时被销毁了~
}

------解决方案--------------------
C=A+B;
相当于C.operator=(A.operator+(B))
operator+函数返回时调用了默认的拷贝构造函数,然后又对c调用了默认的赋值函数。

你需要重写拷贝构造函数,重载赋值运算符,对原来对象的空间重新分配和赋值
这么点代码别怕麻烦