今天我们来了解关于写实拷贝的知识点。
那么,什么是写实拷贝呢?我们先来看一张图
当s2拷贝s1的时候,s1和s2就会指向同一块空间B,那么析构的时候就会把同一块空间析构两次,这样我们的程序就会问题。
为了解决这一问题,我们在拷贝的时候引用计数(_refcount)来解决这一问题,首先先把_refcount置为0,当s1指向B时,让_refcount加1,s2指向B的时候再让_refcount加1。这时_refcount=2。当我们要析构的时候,首先(–_refcount)然后判断它的值是否为0,不为0则不析构,当_refcount的值为0之后我们再真正的析构。
而要实现加入引用计数,我们有两种方式实现
(1)在S1开辟空间的时候,同时开辟一块空间保存_refcount。如图所示:
接着我们来看具体的代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<cstdlib>
using namespace std;
class String
{
public:
String(const char* str)//同时开辟_refcount
:_str(new char[