【String类浅拷贝的实现】C++:String类引用计数浅拷贝的两种实现

原创 2016年05月30日 17:17:36

第一种:

    只采用_str一个变量,利用强制转换前后偏移,获取存取计数的位置,以及存放字符串的位置。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

class String
{
public:
    String(char* str = "")
        :_str(new char[strlen(str) + 5])
    {
        *(int*)_str = 1;
        _str += 4;
        strcpy(_str, str);
    }

    String(const String& s)
        :_str(s._str)
    {
        ++(*(int*)(_str - 4));
    }

    //重载=
    String& operator= (const String& s)
    {
        if (s._str != _str)
        {    
            Release();
            _str = s._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();
    }

void Release()
{
    if (*(int*)(_str) == 0)
    {
        delete[] (_str - 4);//指针返回首地址位置,释放整段空间
    }
}

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

private:
    char* _str;
};


void Test()
{
    String s1("xxxxxxxxxxxxxx");
    String s2(s1);
    s2 = s1;

    String s3("yyyyyyy");
    String s4(s3);
    s4 = s3;

    s3 = s1;

    s3[0] = 'S';
}
int main()
{
    Test();
    system("pause");
    return 0;
}


第二种:

    采用_str以及_pRefCount两个变量。

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;


class String
{
public:
    String(char* str = "")
        :_str(new char[strlen(str) + 1])
        , _pRefCount(new int(1))
    {
        strcpy(_str, str);
    }

    String(String& s)
        :_str(s._str)
        , _pRefCount(s._pRefCount)
    {
        ++(*_pRefCount);
    }

    String& operator=(const String& s)
    {
        /*if(_str != s.str)
        {
            if (--(*_pRefCount) == 0)
            {
                delete[] _str;
                delete _pRefCount;
            }
            _str = s._str;
            _pRefCount = s._pRefCount;
            ++(*_pRefCount);
        }
        return *this;*/

        if (_str != s._str)
        {
            if (--(*_pRefCount) == 0)
            {
                Release();
            }
            _str = s._str;
            _pRefCount = s._pRefCount;
            ++(*_pRefCount);
        }
        return *this;
    }

    ~String()
    {
        /*if (--(*_pRefCount) == 0)
        {
            delete[] _str;
            delete _pRefCount;
        }*/
        Release();
    }

void Release()
{

    if (--(*_pRefCount) == 0)
    {
        delete[] _str;
        delete _pRefCount;
    }
}

//与测试函数2对应
int GetRefCount()
{
    return (*_pRefCount);
}

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

//测试函数1:监视查看
//void Test()
//{
//    String s1("xxxxxxxxxxxxxxxxx");
//    String s2(s1);
//    s2 = s1;
//
//    String s3("yyyyyyyyyyyyy");
//    String s4(s3);
//
//    s1 = s3;
//}

//测试函数2:手动书写函数GetRefCount返回引用计数,断言方法判断是否一致
void Test()
{
    String s1("xxxxxxxxxxxxxxxxx");
    String s2(s1);
    s2 = s1;

    assert(s1.GetRefCount() == 2);
    assert(s2.GetRefCount() == 2);

    String s3("yyyyyyyyyyyyy");
    String s4(s3);

    s1 = s3;
    assert(s1.GetRefCount() == 3);
    assert(s2.GetRefCount() == 1);
    assert(s3.GetRefCount() == 3);
    assert(s4.GetRefCount() == 3);
}

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


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1745771

【C++】浅拷贝和深拷贝(String类)

浅拷贝 class String { public: String(const char *pStr = "") { if(NULL == pStr) { pstr = new ch...
  • qq_31828515
  • qq_31828515
  • 2016年10月19日 12:11
  • 2404

一看就懂的,java深拷贝浅拷贝

前言 这两天,男票兴奋地通知我,我的博客终于有排名了,刚好是20000名,原来都是千里之外。我也比较兴奋,在这里谢谢每一个看到我文章的同学。O(∩_∩)O哈哈~,为什么有一种颁奖典礼的赶脚。真的啦,...
  • XIAXIA__
  • XIAXIA__
  • 2014年12月01日 21:56
  • 6373

vector内数据的深拷贝和浅拷贝

结论:vector内数据使用结构体的话是深拷贝,vector内的数据会拷贝一份保存,vector内数据不会丢失。如果vector内数据是指针的话是进行浅拷贝,数据超出作用域后会自动析构,vector内...
  • earbao
  • earbao
  • 2015年03月20日 15:14
  • 11710

小结 | C++ String类的引用计数的浅拷贝、写时拷贝

引用计数的浅拷贝 写时拷贝
  • Mac_timmy
  • Mac_timmy
  • 2017年12月09日 22:03
  • 36

关于String类浅拷贝引用计数问题

前面我们探讨了String类中深浅拷贝问题,相比于浅拷贝来说,深拷贝的效率较低,在深拷贝中,每拷贝一个对象就需要开辟空间和释放空间,赋值运算符重载也一样需要重新开辟和释放空间。可是当拷贝和赋值的对象只...
  • gmy2016wiw
  • gmy2016wiw
  • 2017年04月08日 16:01
  • 146

String类详解(浅拷贝,深拷贝,引用计数,写时拷贝)

String类:标准库类型string类表示可变长的字符序列,定义在std中,专门用来管理字符串,下面一起看下它的重要考点。 一,浅拷贝       所谓浅拷贝,是指原对象与拷贝对象公用一份实...
  • snow_5288
  • snow_5288
  • 2016年10月23日 18:16
  • 4380

String类的浅拷贝、深拷贝、引用计数、写时拷贝

皆以s2=s1为例 浅拷贝:只是直接将s1的值拷贝过来,s1、s2共用同一块内存。 class String { public: String(const char* str) :_str(...
  • tttjp
  • tttjp
  • 2017年03月18日 18:55
  • 101

C++深拷贝与浅拷贝(实现String类)

浅拷贝:1.什么是浅拷贝? 浅拷贝会出现什么问题?所谓浅拷贝,指的是在对象复制时,只是对对象中的数据成员进行简单的复制,默认拷贝构造函数执行的也是浅拷贝。简单的说,浅拷贝就是值传递,将源空间里面的内容...
  • dai_wen
  • dai_wen
  • 2017年11月09日 17:01
  • 70

C++中String类模拟实现以及深拷贝浅拷贝

在C语言中/C++中,字符串是一个应用很广泛的类型,也是很基础的类型,C语言并没有直接处理字符串的操作而是采用字符指针和字符串数组进行操作,而在C++中标准库为我们封装了一个字符串的类供我们使用,使用...
  • xy913741894
  • xy913741894
  • 2016年10月22日 11:18
  • 678

c++ string类深拷贝其他版本(简洁版,引用计数版,写时拷贝版)

简洁版: class String { public: String(char* pStr="") { if(pStr==NULL) { _pStr...
  • ChenMiao0924
  • ChenMiao0924
  • 2017年03月30日 15:12
  • 204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【String类浅拷贝的实现】C++:String类引用计数浅拷贝的两种实现
举报原因:
原因补充:

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