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;
}
展开
 我来答
guifang0923
2013-11-26 · TA获得超过371个赞
知道小有建树答主
回答量:308
采纳率:100%
帮助的人:357万
展开全部

所以说带指针成员的类一定要定义拷贝构造函数,否则默认拷贝构造函数会直接对指针拷贝地址,这样 出现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; 
    }
更多追问追答
追问
我说老师要求写个拷贝构造函数干嘛。。。我认为没用上所以复制到百度上时删掉了。。。
追答
拷贝我给你的拷贝构造函数,改掉析构函数的错误,我运行过没问题了
认不倒你
2013-11-26 · TA获得超过666个赞
知道小有建树答主
回答量:820
采纳率:50%
帮助的人:361万
展开全部
马克一下。
追问
。。。我是不是给某些人提供答案了,,,只要去掉析构函数大括号里的内容,执行默认析构函数,程序运行正常。但new的东西没都被释放
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式