函数运行到结尾 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse

来源:互联网 发布:tower for mac 编辑:程序博客网 时间:2024/06/01 21:46

原因:未实现拷贝构造函数,错误

原错误:BoundingBox boxArray[2]={box,box2};这里要调用拷贝构造函数,而且在拷贝构造函数中我未给成员指针分配空间。

原文:http://hi.baidu.com/yanbizhu/item/e25da7165eb02cddbf9042fe

指针,真是个好东西,也是个很难调教的东西,不好说,为了他,我们不得不写拷贝构造函数,如下:

struct student
{
int id;
char *p;
int len;
student(){
    id =0;
    p = 0;
    len=0;
}
student(student& stu)
{
    *this = stu;
}
student(int id,char* name,int len)
{
    this->id =id;
    p = new char[len];
    for (int i =0;i< len;i++) {
     p[i] = name[i];
    }
    this->len = len;
}
student& operator = (student& stu)
{
    this->id = stu.id;
    this->len = stu.len;
    this->p = new char[len];
    for (int i =0;i< len;i++) {
     p[i] = stu.p[i];
    }
    return *this;
}
~student(){
    delete []p;
}
};
void main()
{
student s1(10,"wang",4);
student s2=s1;
student s3;
s3 = s1;
}
说明: 类和结构体是很相似的,我就以结构体为例;

student s2=s1;实际上是隐式的调用构造函数student(student& stu);如果没有的话,程序执行到~student()时会出错的,因此它是应该必备的;

s3 = s1;调用的是student& operator = (student& stu); 如果没有的话,程序执行到~student时会出错的,调试程序时在~student()中delete p时 出错点: _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));所以"="运算符的重载是很重要的....

这个assert说明什么问题呢?说明有一块内存在被释放的时候,它的头部里面的信息已经被改掉了,和预期的不一样。内存分配的程序往往在被分配出的内存块头部放上一些校验信息。这个信息内存的用户是不知道也不应该修改的。这样,在内存被释放的时候,内存分配程序就可以验对这个头部信息是否被改过了。若被改过,就说明发生了内存corruption. 这种corruption有两种可能性:1)有人在内存越界写东西;或者:2)这块内存已经被释放了,又被重复释放了一次。 (在第一次被释放中,是内存分配程序改掉了头部信息)。

这就是很多面试官会问关于拷贝构造函数之类的问题的原因,初学者甚至很多的老手也很疑惑,什么时候会调用拷贝构造函数之类的问题,网上有很多的高手,他们提供的资料很全,很值得我们共同的学习...........