系统默认构造函数就是浅拷贝,就是简单的进行赋值操作。

这也就会导致一个问题,使两个指针指向同一块地址。

例:

认识浅拷贝和深拷贝_内存地址

这里编译器书写的默认拷贝函数:

Person(const Person&q){
_score=q._score;
p=q.p;
}

进行简单的赋值操作。

利用new关键字开辟的内存要通过delete关键字进行释放,析构函数这个时候就可以上场了。

~Person(){
delete p;
}

然后,报错了:

认识浅拷贝和深拷贝_赋值_02

原因呢?很简单,因为p1.p和p2.p指向的是同一块地址,依据先定义后析构,p2.p先释放,轮到p1.p释放的时候就出现了问题,由于p2.p已经把那块内存给释放干净了,p1.p再释放,就是非法的了。

说到这里,不得不提一下,虽然释放了p2.p申请的内存地址,但是p2.p指向的地方依旧是那块内存地址,只是里面没有内容了。

认识浅拷贝和深拷贝_析构函数_03

对于深拷贝,就是解决浅拷贝简单的复制操作问题,比如使上面的两个指针指向的地址不同,但是解引用的内容相同。

认识浅拷贝和深拷贝_赋值_04



如有不对,欢迎指正。