c++ 写时拷贝

Posted

tags:

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


写时拷贝--Copy On Writ

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class String
{
public:
 String(char *str = "") :_str(new char[strlen(str)+5])
 {
  _str += 4;
  _GetRefCount(_str) = 1;
  strcpy(_str, str);
 }
 String( String &s) :_str(s._str)
 {
  ++_GetRefCount(s._str);
 }
 int&  _GetRefCount( char* _str)
 {
  return *(int *)(_str - 4);
 }
 String & operator=(String & s)
 {
  if (_str != s._str)
  {
   Release();
   _str = s._str;
   ++_GetRefCount(s._str);
  }
  return *this;
 }
 char &operator[](size_t index)
 {
  if (_GetRefCount(_str) > 1)
  {
   char *tmp = new char[strlen(_str) + 5];
   tmp += 4;
   strcpy(tmp, _str);
   _GetRefCount(tmp) = 1;
   --_GetRefCount(_str);
   _str = tmp;
  }
  return _str[index];
 }
 void Release()
 {
  if (--_GetRefCount(_str) == 0)
  {
   delete[](_str - 4);
   cout << "delete" << endl;
  }
 }
 ~String()
 {
  Release();
 }
private:
 char *_str;
};
void test1()
{
 String s1("Hello world");
 String s2(s1);
 String s3(s1);
 String s4(s1);
 s1[0] = ‘M‘;
 
 String s5("asdasdasdas");
 s5 = s1;
}
int main()
{
 test1();
 system("pause");
 return 0;



技术分享


写时拷贝:  给类增加一个引用计数,拷贝的时候增加一个引用计数,在对类成员进行拷贝时候,只给之前的引用计数加1,析构条件为当引用计数为1 的时候,要对对象进行修改的时候再创建一份新的对象进行修改并改变指针指向





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

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

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

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

C++ String 写时拷贝

C++ 深浅拷贝写时拷贝

C++类的浅拷贝深拷贝以及写时拷贝问题