写时拷贝(方案一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写时拷贝(方案一)相关的知识,希望对你有一定的参考价值。

深拷贝效率低,我们可以应引用计数的方式去解决浅拷贝中析构多次的问题。

首先要清楚写时拷贝是利用浅拷贝来解决问题!!

方案一

class String
{
private:
    char* _str;
    int _refCount;
};


方案一最不靠谱,它将用作计数的整形变量_refCount定义为类的私有成员变量,任何一个对象都有它自己的成员变量_refCount,它们互不影响,只要拷贝出了对象,_refCount大于了1,那么每个对象调用自己的析构函数时--_refCount不等于0,那么它们指向的那块内存都将得不到释放,无法达到我们要的效果。

技术分享技术分享

//以下是对方案一的简单实现,大家可以结合上图感受到方案一的缺陷

#define _CRT_SECURE_NO_WARNINGS 1

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

class String
{
public:
    String(char* str = "")    //不能strlen(NULL)
       :_refCount(0)
    {
       _str = new char[strlen( str) + 1];
       strcpy(_str, str);
       _refCount++;
    }
    String(String &s)
       :_refCount( s._refCount)     
    {
       _str = s._str;
       _refCount++;
       s._refCount = _refCount;
       
       //这里虽然可以让两个对象的_refCount相等,
       //但如果超过两个对象的_str指针都指向同一块内存时,
       //就无法让所有对象的_refCount都保持一致
       //这是方案一的缺陷之一
    }
    ~String()
    {
       if (--_refCount == 0)
       {
            delete[] _str;
           _str = NULL;
           cout << "~String " << endl;
       }
    }
    friend ostream& operator<<( ostream& output, const String &s);
private:
    char* _str;
    int _refCount;
};
ostream& operator<<( ostream& output, const String & s)
{
    output << s._str;
    return output;
}
void Test()
{
    String s1("aaa");
    String s2(s1);
    String s3(s2);
    cout << s1 << endl;
    cout << s2 << endl;
    cout << s3 << endl;
}
int main()
{
    Test();
    system("pause");
    return 0;
}

以下是其它方案链接地址:

方案二:

http://iynu17.blog.51cto.com/10734157/1755185

方案三:

http://iynu17.blog.51cto.com/10734157/1755208

方案四:(推荐)

http://iynu17.blog.51cto.com/10734157/1755213


本文出自 “言安阳” 博客,谢绝转载!

以上是关于写时拷贝(方案一)的主要内容,如果未能解决你的问题,请参考以下文章

写时拷贝(方案二)

Linux写时复制(CopyOnWrite)|写时拷贝|rcu

写时拷贝技术

C++类的浅拷贝深拷贝以及写时拷贝问题

宋宝华:谈一谈Linux写时拷贝(COW)的安全漏洞

宋宝华:谈一谈Linux写时拷贝(COW)的安全漏洞