【C语言】String类的写时拷贝

原创 2016年05月30日 15:04:06

有了引用计数器以后为什么还有写时拷贝呢?

    因为当我有两个String类s1,s2都是指向同一块空间“helle”,当我想将s1修改成“hello”时,我只想将s1指向的空间修改,而不想将s2修改,显然引用计数器不能解决这个问题,所以就有了更完善的写法--写时拷贝。


  1. 写时拷贝

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(_str);
    }

    String& operator=(const String& s)
    {
        if (_str != s._str)
        {
            Release();
            _str = s._str;
            ++GetRefCount(_str);
        }
        return *this;
    }

    char& operator[](size_t index)
    {
        if (GetRefCount(_str) > 1)
        {
            char* tmp = new char[strlen(_str) + 5];
            tmp += 4;
            GetRefCount(tmp) = 1;
            strcpy(tmp, _str);
            --GetRefCount(_str);
            _str = tmp;
        }
        return _str[index];
    }

    ~String()
    {
        Release();
    }

    int& GetRefCount(char* str)
    {
        return *(int*)(str - 4);
    }

    int _GetRefCount()
    {
        return GetRefCount(_str);
    }

    void Release()
    {
        if (--GetRefCount(_str) == 0)
        {
            delete[] _str;
        }
    }

private:
    char* _str;
};

void Test1()
{
    String s1("s1");
    String s2(s1);
    s2 = s1;
    assert(s1._GetRefCount() == 2);
    assert(s2._GetRefCount() == 2);
    String s3("s3");
    String s4(s3);
    s1 = s3;
    assert(s1._GetRefCount() == 3);
    assert(s2._GetRefCount() == 1);
    assert(s3._GetRefCount() == 3);
    assert(s4._GetRefCount() == 3);

}

int main()
{
    Test1();
    system("pause");
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C语言如何获得变量的物理地址以及简单的写时拷贝测试

基本的思路:linux下的/proc/self是对自身进程映射的文件夹,里面的pagemap允许查看到每个虚拟页映射到的物理页。#include #include #include intptr...

String类引用计数的写时拷贝

写时拷贝: 当一个对象被拷贝构造多次,在不改变内容的情况下,多个对象共用同一个空间。 如果某个对象要改变内容,就要另外开辟一块相同的空间,然后改变这个对象的_str指针,再进行写操作 #...

string类的写时拷贝与引用计数

由于浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃。 实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数。 由于释放内存空间,开辟内存空间时花...

写时拷贝的方式实现C++中string类

写时拷贝的两种实现方式:计数器和引用计数

标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

标准C++类std::string的内存共享和Copy-On-Write(写时拷贝),引用计数实现

string类的简单实现(写时拷贝Copy-on-write)

前言:上一篇文章实现了string的深拷贝写法;那我们能不能用浅拷贝写string类呢?当然可以; 一、 (1) 当我们需要对拷贝之后的对象进行修改时,采用深拷贝的方式; 如果不需要修改,只是输...

C++ string类的隐式共享写时拷贝的实现及设计要点

字符串一种在程序中经常要使用到的数据结构,然而在C中却没有字符串这种类型。在C++中,为了方便字符串的使用,在STL中提供了一个string类。该类维护一个char指针,并封装和提供各种的字符串操作。...

c++ String 类的简单实现和写时拷贝

#define _CRT_SECURE_NO_WARNINGS 1 #include #include using namespace std; class String {public: ...
  • uagvdu
  • uagvdu
  • 2016年08月21日 14:11
  • 148

C++string类部分函数仿写(用C语言实现)

注意:有指针成员情况下,写构造函数时一定要先分配空间 同时,要写析构函数,手动释放堆空间#include #include using namespace std;class stringC { ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】String类的写时拷贝
举报原因:
原因补充:

(最多只允许输入30个字)