错误: Debug Assertion Failed!
Program: F:\......\Debug\f0815.exe
File:dbheap.c
Line:1050
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse
......
源程序:
#include<iostream>
#include<fstream>
using namespace std;
class Vector
{
int * v;
int sz;
public:
Vector(int s=1);
Vector(Vector& v1);
void remove(){ delete[] v; }
int size() { return sz; }
void set(int);
void display();
int &operator [] (int);
~Vector(){ delete[] v; cout<<"~Vector"<<endl; }
};
Vector::Vector(int x)
{
set(x);
for(int i=0; i<x; i++)
{
v[i]=0;
}
}
Vector::Vector(Vector& t)
{
sz=t.sz;
set(sz);
for(int i=0; i<sz; i++)
{
v[i]=t[i];
}
// set(v1.sz);
}
void Vector::set(int s)
{
sz = s;
if(s<=0)
{
cerr<<"bad Vector size.\n";
exit(1);
}
v= new int[s];
}
int& Vector::operator[] (int i)
{
if(i<0 || i>=sz)
{
cerr<<"Vector index out of range.\n";
exit(1);
}
return v[i];
}
void Vector::display()
{
for(int i=0; i<sz; i++)
{
cout<<v[i]<<" ";
}
cout<<"\n";
}
class Matrix
{
int *m;
int szl, szr;
public:
void set(int, int);
void remove() { delete[] m; }
int sizeL() { return szl; }
int sizeR() {return szr; }
int &elem(int, int);
};
void Matrix::set(int i, int j)
{
szl=i;
szr=j;
if(i<=0 || j<=0)
{
cerr<<"bad Matrix size.\n";
exit(1);
}
m=new int[i*j];
}
int &Matrix::elem(int i, int j)
{
if(i<0 ||szl<=i || j<0 ||szr<j)
{
cerr<<"Matrix index out of range.\n";
exit(1);
}
return m[i*szr+j];
}
Vector multiply(Matrix &m, Vector &v)
{
if(m.sizeR()!=v.size() )
{
cerr<<"bad multiply Matrix with Vector.\n";
exit(1);
}
Vector r;
r.set(m.sizeL() );
for(int i=0; i<m.sizeL(); i++)
{
r[i]=0;
for(int j=0; j<m.sizeR(); j++)
{
r[i] +=m.elem(i, j)*v[j];
}
}
return r;
}
int main()
{
Vector v1(5);
Vector v2(v1);
for(int k=0; k<5; k++)
{
cout<<v1[k];
}
cout<<endl;
for(k=0; k<5; k++)
{
cout<<v2[k];
}
cout<<endl;
ifstream in("in.txt");
int x, y;
in>>x>>y;
Matrix ma;
ma.set(x, y);
for(int i=0; i<x; i++)
{
for(int j=0; j<y; j++)
{
in>>ma.elem(i, j);
}
}
in>>x;
Vector ve;
ve.set(x);
for(i=0; i<x; i++)
{
in>>ve[i];
}
Vector vx=multiply(ma, ve);
vx.display();
ma.remove();
ve.remove();
vx.remove();
return 0;
}
原因:1.内存泄漏;所以当程序退出时,系统会收回分配的内存,于是调析构函数,由于内存已被错误地释放,于是就会出现“Debug Assertion Failed”的错误。
2.这个assert说明什么问题呢?说明有一块内存在被释放的时候,它的头部里面的信息已经被改掉了,和预期的不一样。内存分配的程序往往在被分配出的内存块头部放上一些校验信息。这个信息内存的用户是不知道也不应该修改的。这样,在内存被释放的时候,内存分配程序就可以验对这个头部信息是否被改过了。若被改过,就说明发生了内存corruption. 这种corruption有两种可能性:1)有人在内存越界写东西;或者:2)这块内存已经被释放了,又被重复释放了一次。 (在第一次被释放中,是内存分配程序改掉了头部信息)。
3.pHead_>nBlockUse就可能是空指针,或它指向的东西已经不存在了。
解决:将红色代码 ma.remove();
ve.remove();
vx.remove();
删除,或者删去remove()成员函数(与~Vector()内容功能重复,且造成上述错误)
参考:http://hi.baidu.com/yanbizhu/blog/item/ac23df0abd20db1d95ca6bed.html
http://www.yesky.com/CPCW/74031217409785856/20010912/196404.shtml