C++中深拷贝与浅拷贝的不同 💖
1.浅拷贝😶🌫️
浅拷贝是指直接用系统提供的拷贝构造函数进行的简单赋值拷贝操作
2.深拷贝😶🌫️
深拷贝是指在堆区中重新申请空间,进行拷贝操作
3.代码示例🤯
构造一个Person类,其中构造函数可以发生函数重载:
1 | class Person { |
在其中添加析构函数,析构函数用于释放我们在堆区中开辟的空间:
1 | ~Person() { |
这时候创建test01函数,用于检验我们的代码:
1 | void test01() { //这时候没有拷贝构造函数 |
在main中调用test01函数,发现程序出现错误 。
分析原因如下:
这是由于上面的代码,如果不写拷贝构造函数,系统自动提供一个拷贝构造函数把数据进行浅拷贝,系统在这时只会开辟一个堆空间,这时候进行析构函数的delete操作会多释放一个堆空间造成非法操作,因为多释放的堆区根本就不存在!
浅拷贝带来的问题:堆空间的重复释放,要利用深拷贝解决。
这时就要构造一个拷贝构造函数,进行深拷贝操作开辟两个堆空间,添加到class类中,代码如下:
1 | Person(const Person &p) { |
这样就完全解决了浅拷贝带来的指针重复指向同一堆区资源,执行释放代码delete时堆区资源重复释放的问题。
4.小结
C++中浅拷贝与深拷贝是容易混淆的点,但加以区分还是能很好辨认,故在编写代码时,要格外注意这一点。
请戳下面评论区,与我互相交流(需科学上网)