1. C++ 浅拷贝

什么是浅拷贝?

一般比较形象的理解,浅拷贝可以理解"值"层面的拷贝,深拷贝可以理解成"内存"上的拷贝,特别是类里面含有指针类型的。

// .h文件
class HasPtrMem
{
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();

void print();
int *p;
};
// .cpp 文件
HasPtrMem::HasPtrMem() : p(new int(0))
{
cout << "HasPtrMem()" << endl;
}

void HasPtrMem::print()
{
cout << *p << endl;
}

HasPtrMem::HasPtrMem(const HasPtrMem& h)
{
*p = *h.p;
}
HasPtrMem::~HasPtrMem()
{
delete p;
}
// main.cpp
HasPtrMem a;
HasPtrMem b(a)
a.print(); // 输出0
b.print(); // 输出0

上面这段代码的执行

HasPtrMem a;    // 调用HasPtrMem::HasPtrMem() : p(new int(0))
HasPtrMem b(a) // 实际上是HasPtrMem b = a,调用HasPtrMem::HasPtrMem(const HasPtrMem& h)

此时main函数执行结束后都会调用析构函数对p的内存进行释放,但是,对象b实际上是指向对象b的内存(相当于直接赋值)

C++浅拷贝深拷贝_c++

如果此时析构函数先对a对象进行析构,此时释放a对象里面指针p的内存,接着再对b对象析构,释放b对象的指针内存,程序crash(由于P的内存实际上在a对象已经被嘎掉了)

所以,类对象里面包含指针数据的,一定要实现深拷贝

2. C++ 深拷贝

深拷贝就是对实际内存进行分配,在对内存的值进行赋值填充(表达不好,有哪个意思懂就可以哈)

C++浅拷贝深拷贝_浅拷贝_02

深拷贝代码

// .h文件
class HasPtrMem
{
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();

void print();
int *p;
};
// .cpp文件
HasPtrMem::HasPtrMem() : p(new int(0))
{
cout << "HasPtrMem()" << endl;
}

void HasPtrMem::print()
{
cout << *p << endl;
}

HasPtrMem::HasPtrMem(const HasPtrMem& h)
{
p = new int(*h.p);
}
HasPtrMem::~HasPtrMem()
{
delete p;
}

这就是深拷贝浅拷贝,不注意就会带来坑爹的代码,造成程序嘎嘎crash!!!!!