jan8705__ 2013-06-14 15:46 采纳率: 0%
浏览 5386

析构函数中使用delete报错

把析构函数里的delete去掉就不会报错了;但是搞不懂:我的构造函数里不是用了new吗,为什么会出现这种情况?
报错信息是:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),网上查了一下都说是重发调用delete的结果,但是我好像没有那么做。

//Matrix.h
class Matrix
{
public:
Matrix();
~Matrix();
Matrix(int,double*); //矩阵行列数、数组指针
Matrix operator+(const Matrix&);//矩阵相加
friend ostream& operator<<(ostream&,const Matrix&);//
private:
int n; //矩阵的行列数
double* pt;
};

//Matrix.cpp
Matrix::Matrix():pt(0)
{
n = 0;
}
Matrix::Matrix(int r,double* p): n(r)
{

pt = new double[r*r];
for(int i=0; i<r*r;i++)

pt[i] = p[i];

}
Matrix::~Matrix()
{
delete []pt;
pt = 0;
}
//矩阵相加函数实现
Matrix Matrix::operator+(const Matrix& m)
{
for(int i=0;i<n*n;i++)

pt[i] = pt[i] + m.pt[i];

return *this;
}
//矩阵输出函数的实现
ostream& operator<<(ostream& output,const Matrix& m)
{

for(int i=0;i<m.n*m.n;i++)

{

if((i+1)%m.n == 0)

output<<m.pt[i]<<endl;

else

output<<m.pt[i]<<" ";

}

return output;

}

然后就是main函数中
double *p1,*p2,x,y;
int n;

cout<<"请输两个矩阵的行列数(n*n):"<<endl<<"n=";
cin>>n;

cout<<"请输入第一个矩阵m1的元素:"<<endl;

p1=(double *)malloc(sizeof(double)*n*n);
for(int i=0;i<n*n;i++)      
{       
    cin>>x;     
    p1[i]=x;    
}

cout<<"请输入第二个矩阵m2的元素:"<<endl;
p2=(double*)malloc(n*n*sizeof(double));
for(int j=0;j<n*n;j++)  
{   
    cin>>y; 
    p2[j]=y;    
}   

Matrix m1(n,p1),m2(n,p2),M;
M=m1+m2;    
cout<<"m1+m2:"<<endl;   
cout<<M<<endl;
free(p1);
free(p2);
return 0;
  • 写回答

2条回答 默认 最新

  • fanxu1986 2015-01-21 13:12
    关注

    缺少拷贝构造函数,对象引用时,拷贝构造出新的对象,而pt指向的申请空间都是同一片,最终你释放了两次,那么第二次必然就野了

    评论

报告相同问题?

悬赏问题

  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决