引用计数:



//写时拷贝  引用计数
#include<iostream>
using namespace std;
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str) + 1])
, _pRefCount(new int(1))//初始为1
{
strcpy(_str, str);
}
String(String& s)
:_str(s._str)//
, _pRefCount(s._pRefCount)//
{
++(*_pRefCount);
}

String& operator=(const String& s)
{
if (_str != s._str) //防止自己给自己赋值
{
if (--(_pRefCount) == 0) //防止有两个以上的指向,造成野指针
{//前置减减,如果等于0,就说明只剩下一个元素
delete[] _str;
delete _pRefCount;
}//先删除原来的东西
_str = s._str; //_str指针指向s的
_pRefCount = s._pRefCount; //_pRefCount指向s的
++(*_pRefCount);
}
return *this;
}

~String()
{
if (--(*_pRefCount) == 0)//前置减减,等于0,说明只剩下一个元素,删除
{
delete[] _str;
delete _pRefCount;
}
}
private:
char* _str; //_str
int* _pRefCount;//记录个数的指针
};

void TestPrefCount1()
{
String s1("xxxxxxxxxxxx");
String s2 = s1;

String s3("yyyyyyyyyyyyyyyy");
String s4(s3);

String s5;
s5 = s1;
}

void TestPrefCount2()
{
String s1("wwwwww");
String s2;
s2 = s1;
String s3("yyyyyyyy");
String s4(s3);

s1 = s3;
}