【C语言】【面试题】C++中String类引用计数器的浅拷贝写法与深拷贝写法

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

Linux操作下String类的实现--引用计数器

    1.引用计数器写法一

写法一个人比较喜欢叫他双指针法,因为他是在类里面创建了两个指针来实现的一个是指针_str,另外一个是用来保存指向同一块空间个数的指针_pRefCount.

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)
    {
        /*char* tmp = new char[strlen(s._str) + 1];
        strcpy(tmp, s._str);
        delete[] _str;
        _str = tmp;*/ //这种写法不符合引用计数器的原理
        /*swap(_str, s._str);*/
        if (--(*_pRefCount) == 0)
        {
            delete[] _str;
            delete[] _pRefCount;
        }
        _str = s._str;
        _pRefCount = s._pRefCount;
        ++(*_pRefCount);
        return *this;
    }

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

private:
    char* _str;
    /*static int _refCount;*///变成静态的以后,需要在类的外面定义
    int* _pRefCount;
};

//int String::_refCount = 0;

void Test1()
{
    String s1("xxx");
    String s2(s1);
    String s3("yyy");
    s3 = s2;
    /*String s4(s3);*/
}

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

这种写法简单易懂,也容易想到,但是由于要开辟两块空间一块大的一块小的,容易造成系统产生很多的内存碎片,所以有了另外一种写法

    2.引用计数器写法二

这种写法的思路是在开辟空间时多开辟四个字节的空间,在头部用四个字节的空间来保存指向同一块空间的个数,这样即避免了内存碎片的产生,也使得操作起来更为方便,不要要操作两块空间。

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

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

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


    ~String()
    {
        if (--(*(int*)(_str - 4)) == 0)
        {
            delete[](_str - 4);
        }
    }

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

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

private:
    char* _str;
};


int main()
{

    system("pause");
    return 0;
}


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

c++深拷贝和浅拷贝

C++中类的拷贝有两种:深拷贝,浅拷贝当出现类的等号赋值时,会调用拷贝函数 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅...
  • u010700335
  • u010700335
  • 2014年10月06日 19:27
  • 1659

C++的深拷贝与浅拷贝

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a;  而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单...
  • lpp0900320123
  • lpp0900320123
  • 2014年09月02日 15:35
  • 39709

C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝

先留个题目,下午回来总结下。。。 吃饭去
  • top_along
  • top_along
  • 2014年05月19日 11:53
  • 1596

面试题:String类的浅拷贝、深拷贝、写时拷贝

String的拷贝是面试中的经常会被问到的问题,所以,学懂String类是非常重要的。下面我们先来看一段代码:class String { public: String(const char*...
  • ChaseRaod
  • ChaseRaod
  • 2017年04月16日 15:50
  • 334

【C++】c++String类浅拷贝、深拷贝

c++String类浅拷贝、深拷贝
  • SuLiJuan66
  • SuLiJuan66
  • 2015年10月03日 18:48
  • 516

C++ 深拷贝 与 浅拷贝

本文分三部分阐释深拷贝于浅拷贝,着眼点主要还是在深拷贝。第一部分讲述为什么会有拷贝,即对象之间的复制。第二部分讲述为什么会有深拷贝于浅拷贝,即类成员存在资源分配。第三部分阐释深拷贝于浅拷贝的定义与使用...
  • u013630349
  • u013630349
  • 2015年06月01日 22:33
  • 933

C++——string的深拷贝与浅拷贝

在c++中,基本所有的类都要考虑深拷贝,浅拷贝与写时拷贝,根据不同的定义,选择适合自己的拷贝方式。时间类就可以用浅拷贝,而二叉树,string类就需要深拷贝。 string类在vs编译器下使用的深拷...
  • qq_36782456
  • qq_36782456
  • 2017年04月29日 16:12
  • 151

C++对象指针浅拷贝和深拷贝

2017年12月7日,这是我在CSDN写的第一篇博客,写博客的目的也是对我知识进行查漏补缺,把我C++之路遇到的种种问题记录下来,让自己不能反同样的错误。 -------杂谈 浅拷贝和深拷贝 ...
  • qq362252786
  • qq362252786
  • 2017年12月07日 17:32
  • 67

C++ 拷贝构造函数中浅拷贝与深拷贝

浅拷贝构造函数 看一段拷贝构造函数的代码#include #include using namespace std; class Array{ public : Array(){ ...
  • libin66
  • libin66
  • 2016年11月12日 13:48
  • 1457

string类之深拷贝的两种写法

1 第一种就是普通写法,需要强调的地方不多,代码中有关地方已经给出注释/*#include using namespace std; # class String { public: //这是...
  • yueyueLEMON
  • yueyueLEMON
  • 2016年06月06日 22:48
  • 2458
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】【面试题】C++中String类引用计数器的浅拷贝写法与深拷贝写法
举报原因:
原因补充:

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