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

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

方案一

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

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

spacer.gif

//以下是对方案一的简单实现,大家可以结合上图感受到方案一的缺陷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;       }    }    private:    char* _str;    int _refCount;};

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

方案二:

方案三:

方案四:(推荐)