【C++】模拟String___引用计数写实拷贝

时间:2022-07-08 19:49:26

> 1、引用计数作为独立的一块空间

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

#class String
{
public:
String(char* str="")
:_Refcount(new int(1))
{
_str = new char[strlen(str) + 1];
_str = str;
*(_Refcount) = 1;
}

String(String const& str)
:_str(NULL)
{
_str = str._str;
_Refcount=str._Refcount;
(*(_Refcount)) += 1;
}

int& GetRefcount()
{
if ((*_Refcount) == 0)
{
delete[] _str;
delete[] _Refcount;
_str = NULL;
}
return *(_Refcount);
}

String& operator=(String const&str)
{
if (_str != str._str)
{
if (--GetRefcount() == 0)
{
{
delete[] _str;
delete _Refcount;
}
_str = str._str;
_Refcount = str._Refcount;
GetRefcount()++;
}

}
}



~String()
{
if (GetRefcount() != 0)
{
GetRefcount()--;
}
}

char* GetStr()
{
return _str;
}
private:
char* _str;
int* _Refcount;
};

void FunTest()
{
String s1("hello world!");
String s2(s1);
cout << s1.GetStr() << endl;
cout << s2.GetStr() << endl;

}

int main()
{
FunTest();
system("pause");
return 0;
}

2、字符串开辟四个字节存储引用计数


#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

class String
{
public:
String(char* str)
:_str(new char[strlen(str)+5])
{
(*((int*)_str)) = 1;
_str = _str + 4;
strcpy(_str, str);
}

String(String const &str)
:_str(NULL)
{
_str = str._str;
(*(((int*)_str) - 1))++;
}

String& operator=(String const&str)
{
if (_str != str._str)
{
if (--GetRefcount() == 0)
{
_str = str._str;
++GetRefcount();
}
_str = str._str;
(*(((int*)_str) - 1))++;

}
}


char* GetStr()
{
return _str;
}

int& GetRefcount()
{
if ((*(((int*)_str) - 1)) == 0)
{
delete[] (_str-4);
}
return (*(((int*)_str) - 1));
}

~String()
{
if (GetRefcount() != 0)
{
(*(((int*)_str) - 1))--;
}
}
private:

char* _str;
};


void FunTest()
{
String s1("hello world!");
String s2(s1);
cout << s1.GetStr() << endl;
cout << s2.GetStr() << endl;

}
int main()
{
FunTest();
system("pause");
return 0;
}