string类的引用计数的写时拷贝分析

写时拷贝(copy-on-write)
使用了引用计数的复制方法,在复制的时候会有一个变量来保存引用的次数,类似于:
假设A要管理S1这块空间,然后B也想要管理使用S1,写时拷贝不需要把S1复制一份再让B去管理修改,而是将B的指针指向S1这块空间,则S1就被A和B同时管理使用,减少了系统开支,提升了系统性能。
但是在程序结束调用析构函数进行释放空间的时候就会产生问题,按照构造函数与析构函数成对出现的原则,有多少次构造就会析构多少次,A和B分别构造,就会有相应的析构,但是A与B指向同一块空间,而同一块空间不可以被析构多次,这里就会产生问题,而引用计数的写时拷贝就可以解决这个问题。
解决方法:
当指向S1这块空间的指针只剩下1个或者0个时,析构函数被调用进行释放,这时候才是真正的Free这块空间,而当管理S1这块空间的指针增加时,计数就加一。

class String
{
    public:
        String(const char*str)//构造函数
        :_str(new char[strlen(str)+1])
        ,_refCount(1)
    {}
    String(String&s)//s2(s1)
    {
        _str=s._str;
        _rerCount=s._refCount;
        ++refCount;
    }
    ~String()//析构函数
    {
        if(--_refCount==0)
        {
            delete[]_str;
        }
    }
    private:
        char*_str;
        int _refCount;
}       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值