学习目标
学习深拷贝和浅拷贝的区别与使用,这非常有必要!
学习内容
深拷贝和浅拷贝
1、浅拷贝:就是简单赋值的拷贝过去
2、深拷贝:重新在堆里建一个空间,在拷贝过去
上面我们简单的阐述了一下深拷贝和浅拷贝的定义,下面详细解释一下
💖所谓浅拷贝,就是赋值操作,将内容拷贝一份出来,但不被新建一个地址空间,即共享一个空间,如下图:将一个类p1拷贝一份p2,但是其指向的内存地址不变的,也就是说,只是将内容复制出来一份,但不会复制空间
理解:A拷贝出B,A改变,B也改变
💖所谓深拷贝就是将地址在堆区也拷贝出来一份,不再是简单的赋值拷贝,同样的如下图所示,当拷贝完成后,也同样在堆区在建一个地址存放
理解:A拷贝出B,A改变,B不改变
💖什么时候要使用深拷贝呢?
一般情况一下都是采用浅拷贝(即类默认的拷贝构造函数)
但当我们的成员有在堆开辟空间(即new)时,这个时候就要采用深拷贝,防止在析构函数时带来重复释放内存的问题
学习代码
#include<iostream>
#pragma warning(disable:4996)
using namespace std;
class Person
{
public:
char* getchar(){
return m_Name;
}
int getage() {
return m_Age;
}
Person(const char* name, int age) {
m_Name = new char[strlen(name) + 1];
strcpy(m_Name, name);
m_Age = age;
}
//深拷贝 若不采用深拷贝,就会有重复释放内存问题,这里深拷贝操作就是new一个堆区内存
Person(const Person& p) {
m_Name = new char[strlen(p.m_Name) + 1];
strcpy(m_Name, p.m_Name);
m_Age = p.m_Age;
}
~Person() {
cout << "析构函数被调用了..." << endl;
delete[]m_Name;
m_Name = nullptr;
}
private:
char* m_Name;
int m_Age;
};
int main() {
Person p1("nihao", 21);
cout << "名字是:" << p1.getchar() << "年龄是:" << p1.getage() << endl;
//浅拷贝方式 析构函数释放出现错误,重复释放同一个内存
Person p2 = p1;//深拷贝
cout << "名字是:" << p2.getchar() << "年龄是:" << p2.getage() << endl;
return 0;
}