实现两种方式的引用计数写时拷贝。——新创建引用计数 和 引用计数在头上

本文介绍了一个使用 C++ 实现的带有引用计数机制的字符串类。该类实现了基本的构造、拷贝构造、赋值操作符重载等功能,并采用写时复制策略来提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS -1
//调用sacnf和strcpy会出现报错

include<iostream>
#include<stdlib.h>

using namespace std;


  • 新创建引用计数

这里写图片描述
代码实现:

class String
{
public:
    String(char* str = "") //构造函数

        :_str(new char[strlen(str) + 1])

        , _pCount(new int(1))
    {
        strcpy(_str, str);
    }


    // s2(s1) 
    String(const String& s)//拷贝构造
        :_str(s._str)
        ,_pCount(s._pCount)
    {
        (*_pCount)++;
    }


    void swap(char *x, char*y)
    {
        char tmp = *x;
        *x = *y;
        *y = *x;
    }


    String& operator=(const String& s)
    //赋值运算符的重载
    {
        if (&s != this)
        {
            //char*str = new char[strlen(str) + 1];
            if (--(*_pCount) == 0)
            {
                delete[] _str;
                delete[] _pCount;
                _str = NULL;
                _pCount = NULL;
            }
            _str = s._str;
            _pCount = s._pCount;
            (*_pCount)++;
        }
        return *this;
    }




    ~String()//析构函数
    {
        if (--(*_pCount)== 0)
        {
            delete[]_str;
            delete[]_pCount;
            _str = NULL;
            _pCount = NULL;
        }
    }


    const char* c_str()//返回当前字符串
    {
        return _str;
    }


    void CopyOnWrite()//写实拷贝
    {
        if ((*_pCount) > 1)
        {
            char* newstr = new char[strlen(_str) + 1];
            strcpy(newstr, _str);
            (*_pCount)--;
            _pCount = new int(1);
        }
    }


    void Insert(size_t pos, const char*str)
    {
        CopyOnWrite();
    }


   char& operator[](size_t pos)
   {
       CopyOnWrite();
       return _str[pos];
    }

private:
    char* _str;
    int * _pCount;
};


int main()
{
    String s1("123");
    String s2(s1);
    String s3("456");

    s1 = s3;

    system("pause");
    return 0;
}



  • 引用计数在头上:

这里写图片描述

代码实现:

class String
{
public:
    String(char* str = "")
        :_str(new char[strlen(str) + 5])
        //开辟一个四字节的pCount指针空间
    {
        strcpy(_str, str);
        GetCount() = 1;
    }

    int& GetCount()
    {
        return (*(int *)(_str-4));
    }

    // s2(s1) 
    String(const String& s)
        :_str(s._str)
    {
        GetCount()++;
    }


    void swap(char *x, char*y)
    {
        char tmp = *x;
        *x = *y;
        *y = *x;
    }




    String& operator=(const String& s)
    {
        if (&s != this)
        {
            //char*str = new char[strlen(str) + 1];
            if (--GetCount() == 0)
            {
                _str -= 4;
                delete[] _str;
                _str = NULL;
            }
            _str = s._str;
            GetCount()++;
        }
        return *this;
    }



    ~String()
    {
        if (GetCount() == 0)
        {
            _str -= 4;
            delete[]_str;
            _str= NULL;
        }
    }


    const char* c_str()
    {
        return (_str-4);
    }



    void CopyOnWrite()
    {
        if (GetCount() > 1)
        {
            char* newstr = new char[strlen(_str) + 5];
            newstr += 4;
            strcpy(newstr, _str);
            GetCount()--;
            _str = newstr;
            GetCount() = 1;
        }
    }


    void Insert(size_t pos, const char*str)
    {
        CopyOnWrite();
    }



    char& operator[](size_t pos)
    {
        CopyOnWrite();
        return _str[pos];
    }



private:
    char* _str;

};



int main()
{
    String s1("123");
    String s2(s1);
    String s3("456");

    s1 = s3;
    cout << s3[2] << endl;
    s3[2] = 'x';
    cout << s3[2] << endl;

    system("pause");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值