_BLOCK_TYPE_IS_VALID(pHead->nBlockUse

错误: Debug Assertion Failed!

            Program: F:\......\Debug\f0815.exe

           File:dbheap.c

          Line:1050

          Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse

......

_BLOCK_TYPE_IS_VALID(pHead-nBlockUse - dragoo747450 - 我的博客

源程序:

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值