c++构造函数中使用new,析构函数用delete删除,出错
#include<iostream>usingnamespacestd;classmatrix{public:matrix(inti,intj)//构造函数{rows=i...
# include<iostream>
using namespace std;
class matrix
{
public:
matrix (int i,int j) //构造函数
{
rows=i;
cols=j;
p=new int*[i];
for(int k=0; k<i; k++)
p[k]=new int[j];
}
~matrix() //析构函数
{
int i;
for(i=0; i<cols; i++)
delete []p[i];
delete []p;
}
void input();
void Print();
void Add(matrix a, matrix b);
void Minus(matrix a, matrix b);
private:
int rows,cols;
int **p;
};
void matrix::input(void)
{
int i,j;
for(i=0; i<rows; i++){
cout<<"请输入矩阵第"<<i+1<<"行:";
for(j=0; j<cols; j++)
cin>>p[i][j];
}
cout<<endl;
}
void matrix::Print()
{
int i,j;
for(i=0; i<rows; i++){
for(j=0; j<cols; j++){
cout<<p[i][j];
cout<<'\t';
}
cout<<endl;
}
}
void matrix::Add(matrix a, matrix b)
{
int i,j;
for(i=0; i<rows; i++){
for(j=0; j<cols; j++)
p[i][j]=a.p[i][j] + b.p[i][j];
}
}
void matrix::Minus(matrix a, matrix b)
{
int i,j;
for(i=0; i<rows; i++){
for(j=0; j<a.cols; j++)
p[i][j]=a.p[i][j] - b.p[i][j];
}
}
int main()
{
matrix A1(4,5),A2(4,5),A3(4,5);
A1.input();
A2.input();
A3.Add(A1,A2);
A3.Print(); //第一次A3正常输出
cout<<endl;
A3.Minus(A1,A2);
A3.Print(); //第二次A3输出异常,是乱码,之后程序崩溃
//2用new动态创建矩阵类的对象
cout<<endl<<"用new动态创建对象"<<endl;
matrix *pA1=new matrix(4,5), *pA2=new matrix(4,5), *pA3=new matrix(4,5);
pA1->input();
pA2->input();
pA3->Add(A1,A2);
pA3->Print();
cout<<endl;
pA3->Minus(A1,A2);
pA3->Print();
delete pA1,pA2,pA3;
return 0;
} 展开
using namespace std;
class matrix
{
public:
matrix (int i,int j) //构造函数
{
rows=i;
cols=j;
p=new int*[i];
for(int k=0; k<i; k++)
p[k]=new int[j];
}
~matrix() //析构函数
{
int i;
for(i=0; i<cols; i++)
delete []p[i];
delete []p;
}
void input();
void Print();
void Add(matrix a, matrix b);
void Minus(matrix a, matrix b);
private:
int rows,cols;
int **p;
};
void matrix::input(void)
{
int i,j;
for(i=0; i<rows; i++){
cout<<"请输入矩阵第"<<i+1<<"行:";
for(j=0; j<cols; j++)
cin>>p[i][j];
}
cout<<endl;
}
void matrix::Print()
{
int i,j;
for(i=0; i<rows; i++){
for(j=0; j<cols; j++){
cout<<p[i][j];
cout<<'\t';
}
cout<<endl;
}
}
void matrix::Add(matrix a, matrix b)
{
int i,j;
for(i=0; i<rows; i++){
for(j=0; j<cols; j++)
p[i][j]=a.p[i][j] + b.p[i][j];
}
}
void matrix::Minus(matrix a, matrix b)
{
int i,j;
for(i=0; i<rows; i++){
for(j=0; j<a.cols; j++)
p[i][j]=a.p[i][j] - b.p[i][j];
}
}
int main()
{
matrix A1(4,5),A2(4,5),A3(4,5);
A1.input();
A2.input();
A3.Add(A1,A2);
A3.Print(); //第一次A3正常输出
cout<<endl;
A3.Minus(A1,A2);
A3.Print(); //第二次A3输出异常,是乱码,之后程序崩溃
//2用new动态创建矩阵类的对象
cout<<endl<<"用new动态创建对象"<<endl;
matrix *pA1=new matrix(4,5), *pA2=new matrix(4,5), *pA3=new matrix(4,5);
pA1->input();
pA2->input();
pA3->Add(A1,A2);
pA3->Print();
cout<<endl;
pA3->Minus(A1,A2);
pA3->Print();
delete pA1,pA2,pA3;
return 0;
} 展开
2个回答
展开全部
所以说带指针成员的类一定要定义拷贝构造函数,否则默认拷贝构造函数会直接对指针拷贝地址,这样 出现A3.Add(A1,A2); 这样A1,A2在函数中生存的临时变量释放指针时将本来的A1,A2的指针空间也释放了,因为是地址拷贝,临时变量跟原来的对象中的指针成员是用一个地址,加上自定义的拷贝构造函数就好了:
void Minus(matrix a, matrix b);
matrix(const matrix &rhs) {
if(this != &rhs) {
rows=rhs.rows;
int i,j;
cols=rhs.cols;
p=new int*[rows];
for(i=0; i<rows; i++)
p[i]=new int[cols];
for(i=0; i<rows; i++){
for(j=0; j<cols; j++)
p[i][j] = rhs.p[i][j] ;
}
}
}
注意你的析构函数也是错的:
~matrix() //析构函数
{
int i;
for(i=0; i<rows; i++)//这里是rows
delete []p[i];
delete []p;
}
更多追问追答
追问
我说老师要求写个拷贝构造函数干嘛。。。我认为没用上所以复制到百度上时删掉了。。。
追答
拷贝我给你的拷贝构造函数,改掉析构函数的错误,我运行过没问题了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询