![]() ![]() |
|
MoreEffectiveC++之引用计数 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/3/20 18:36:03 文章录入:杜斌 责任编辑:杜斌 | |
|
|
实现 classRCObject { public: RCObject():refCount(0),shareable(true){} RCObject(constRCObject&):refCount(0),shareable(true){} RCObject& operator=(constRCObject& rhs){return *this;} virtual ~RCObject()=0; void AddReference(){++refCount;} void RemoveReference(){if (--refCount == 0) deletethis;} void markUnshareable(){shareable = false;} bool isShareable() const{returnshareable;} bool isShared() const {returnrefCount > 1;} private: int refCount; bool shareable; }; RCObject::~RCObject(){} template <classT> class RCPtr { public: RCPtr(T* realPtr = 0):pointee(realPtr){init();} RCPtr(constRCPtr& rhs):pointee(rhs.pointee){init();} ~RCPtr(){if (pointee) pointee->RemoveReference();} RCPtr& operator = (constRCPtr& rhs) { if (pointee!=rhs.pointee) { if (pointee) pointee->RemoveReference(); pointee = rhs.pointee; init(); } return *this; } T* operator->() const { returnpointee;} T& operator*() const{return *pointee;} private: T* pointee; void init() { if (pointee == 0) return; if (pointee->isShareable() == false) pointee = newT(*pointee); pointee->AddReference(); } }; class String { public: String(const char* value = ""):value(newStringValue(value)){} const char& operator[](intnIndex) const { return value->data[nIndex]; } char& operator[](intnIndex) { if (value->isShared()) value = newStringValue(value->data); value->markUnshareable(); returnvalue->data[nIndex]; } protected: private: struct StringValue:publicRCObject { char* data; String Value(constchar* initValue) { init(initValue); } String Value(constStringValue& rhs) { init(rhs.data); } void init(constchar * initValue) { data = newchar[strlen(initValue) + 1]; strcpy(data,initValue); } ~String Value() { delete [] data; } }; RCPtr<StringValue> value; }; 这是Meyers给出的String的实现,然而我的观点是如果没有特别的必要的话,对stirng最好不要使用引用计数,因为在多线程程序中同步的代价要大于引用计数本身的好处,得不偿失。 |
|
![]() ![]() |