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

本文详细解析了C++中拷贝构造函数的作用、使用场景及注意事项,通过实例展示了如何正确实现拷贝构造函数,并解释了其在避免内存泄漏和数据一致性方面的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

原错误: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)这块内存已经被释放了,又被重复释放了一次。 (在第一次被释放中,是内存分配程序改掉了头部信息)。

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


#include <stdio.h> #include <stdlib.h> char x; typedef struct stack { char data; struct stack *next; } Stack; typedef struct head { int num; struct stack *bottom; struct stack *top; } Shead; Shead *initHead(); int Push(Shead *); int main() { Shead *phead; phead=initHead(); Push(phead); return 0; } Shead *initHead() { Shead *p=(Shead *)malloc(sizeof(Shead)); p->num=0; p->bottom=p->top=NULL; return p; }; int Push(Shead *phead) { if(phead == NULL) { return 0; } Stack *ptr=phead->bottom; while(1) { scanf("%c",&x); if(x==&#39;(&#39; || x==&#39;[&#39; || x==&#39;{&#39;) { Stack *p=(Stack *)malloc(sizeof(Stack)); p->data=x; p->next=NULL; if(phead->num==0) { phead->bottom=phead->top=p; } else { phead->top->next=p; phead->top=p; } phead->num++; } if(x==&#39;)&#39; || x==&#39;]&#39; || x==&#39;}&#39;) { if(phead->num==0) { printf("栈空且有右括号单身,匹配失败\n"); break; } if ((phead->top->data == &#39;(&#39; && x == &#39;)&#39;) || (phead->top->data == &#39;[&#39; && x == &#39;]&#39;) || (phead->top->data == &#39;{&#39; && x == &#39;}&#39;)) { printf("匹配 &#39;%c&#39; 和 &#39;%c&#39;\n", phead->top->data, x); while(ptr->next!=phead->top) { printf("1"); ptr=ptr->next; } ptr->next = NULL; free(phead->top); phead->top=ptr; phead->num--; } else { printf("错误:括号不匹配 &#39;%c&#39; 和 &#39;%c&#39;\n", phead->top->data, x); break; } } } // 最终检查栈是否为空 if (phead->num == 0) { printf("匹配成功!\n"); } else { printf("错误:栈中剩余左括号\n"); } return 1; } 找出问题
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值