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

来源:互联网 发布:linq 不重复数据 编辑:程序博客网 时间:2024/05/19 20:43

写时拷贝(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;}