C++浅拷贝深拷贝

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++浅拷贝深拷贝相关的知识,希望对你有一定的参考价值。

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++浅拷贝深拷贝_赋值

如果此时析构函数先对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!!!!!


以上是关于C++浅拷贝深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

C++中,啥是深拷贝?啥是浅拷贝?

C++:浅拷贝与深拷贝

C++:浅拷贝与深拷贝

C++——浅拷贝深拷贝写时拷贝详解

C++——浅拷贝深拷贝写时拷贝详解

C++——浅拷贝深拷贝写时拷贝详解