C++:深浅拷贝与写时拷贝

首先我们明确一下深浅拷贝的概念。
什么是浅拷贝

所谓的浅拷贝仅仅拷贝了对象的指针,并不会额外的为对象开辟一段内存空间,而是拷贝的对象的指针指向了被拷贝对象的内存空间,也就是说,这个时候有两个指针指向同一块内存空间,下面以string类的实现画图说明。

这里写图片描述
什么是深拷贝

与浅拷贝大为不同,深拷贝是实实在在的重新开辟一段新的内存空间,再把被拷贝对象的数据依次拷贝到自己的空间中,两个指针分别指向自己的内存空间。下面以string类的实现画图说明。

这里写图片描述
浅拷贝造成的问题

如果类当中有指针对象,而我们采用的是浅拷贝,那么就有两个对象指向同一块内存,但最终释放空间(析构)时,因为要释放两个对象,所以他们指向的那一块空间就会被释放两次,从而导致崩溃的问题。如果此时采用深拷贝,在释放时就会各自释放掉各自的空间,就可以很好的解决这个问题。
链接:string类的实现(深拷贝)

深拷贝造成的问题

由于深拷贝重新开辟了一块空间,并且将被拷贝对象的数据一一拷贝过来,这样一来就有可能在内存中存在多份完全一样的数据,不得不说,大量的冗余数据对空间是一种极大的浪费。

由此看来,无论是深拷贝还是浅拷贝都存在这一定的问题,不能完美的解决。至此,又有了写时拷贝(引用计数),引用计数方法的提出和应用就很好的弥补了深浅拷贝的不足。
写时拷贝

在开辟空间时多开辟一个字节的空间,用来存放计数(count)的值。当我们第一次为对象开辟空间时将其初始化为1,在之后又对象想要拷贝该对象时,不用再重新开辟一段空间,而是直接让指针指向这块已经开好的空间,但是,要将这块空间中的引用计数的值+1。当我们的对象使用完毕进行析构时先判断空间中的引用计数的值,如果大于1,则直接将其-1即可,如果发现引用计数的值刚好为1,则才将其释放掉。
这里的引用计数的值就相当于是当前有多少个对象正在使用它。

猜你喜欢

转载自blog.csdn.net/qq_40927789/article/details/81436335