C++优化string,实现写时拷贝

/*
优化string
复制的时候 仅复制引用,只有在修改内容时,才复制内容
即实现写时拷贝
*/

class COWMyString
{
public:
    //默认参数
    COWMyString(const char *str = "") :m_str(strcpy(new char[strlen(str) + 1], str))
    {
        if (m_str) {
            m_count = new size_t(1);
        }
        else {
            m_count = new size_t(0);
        }
    }

    ~COWMyString(void)
    {

        (*this->m_count)--;
        if (*this->m_count == 0)
        {
            delete []this->m_str;
            delete this->m_count;
        }
    }

    //深拷贝构造
    COWMyString(const COWMyString&that)
    {
        if (this != &that) {
            this->m_str = that.m_str;
            //指针指向的实际上是同一个计数器,同一块内存
            this->m_count = that.m_count;
            (*this->m_count)++;
        }
    }

    //深拷贝赋值
    COWMyString&operator=(const COWMyString&that)
    {
        //指针指向的实际上是同一个计数器,同一块内存
        if (this->m_str == that.m_str)
        {
            return *this;
        }

        if (this->m_str)
        {
            //将原来的引用计数减一
            (*this->m_count)--;
            if (this->m_count == 0) {
                delete []this->m_str;
                delete this->m_count;
            }

            this->m_str = that.m_str;
            //指针指向的实际上是同一个计数器,同一块内存
            this->m_count = that.m_count;
            (*this->m_count)++;
        }

        return *this;
    }

    //copy on write
    char &operator[](size_t index)
    {
        if (index>strlen(m_str))
        {
            static char nullchar = 0;
            return nullchar;
        }
        (*this->m_count)--;
        m_str = strcpy(new char[strlen(m_str)+1], m_str);
        m_count = new size_t(1);

        return *(m_str + index);

    }

    const char *c_str(void)const
    {
        return m_str;
    }

private:
    //指针
    char* m_str;
    //计数器
    size_t* m_count;
};

 

posted @ 2021-03-17 17:01  Truman001  阅读(201)  评论(0编辑  收藏  举报