基于灵巧指针和引用计数的String类
2014-03-12 10:07
447 查看
/** *利用灵巧指针和引用计数功能实现string类 **/ //类头文件 //smart pointer用来管理类的指针成员,避免内存泄露 template <class T> class RCPtr { public: RCPtr(T* realPtr = 0); RCPtr(const RCPtr&); ~RCPtr(); RCPtr& operator=(const RCPtr&); T* operator->() const; T& operator*() const; private: T* pointee; void Init(); }; //用于进行引用计数功能的虚基类 class RCObject() { public: void AddReference(); void RemoveReference(); void MarkUnshareable(); bool IsShareable() const; bool IsShared() const; protected: RCObject(); RCObject(const RCObject&); RCObject& operator=(const RCObject&); virtual ~RCObject() = 0; private: int refCount; bool shareable; }; //对string进行引用计数和灵巧指针的应用 class String { public: //没有拷贝构造和赋值以及析构,编译器自动生成 //并且由于灵巧指针的存在,调用StringValue的拷贝,完成自己的功能 String(const char* value = ""); const char& operator[](int index) const; char& operator[](int index); private: //StringValue继承RCObject,从而实现了引用计数功能,在父类进行计数控制 struct StringValue:public RCObject { char* data; StringValue(const char* initValue); StringValue(const StringValue&); void Init(const char* initValue); ~StringValue(); }; private: //灵巧指针 RCPtr<StringValue> value; }; //实现文件RCObject RCObject::RCObject():refCount(0),shareable(true){} //虚基类引用计数为0,是为了让用户控制AddReference RCObject::RCObject(const RCObject&):refCount(0),shareable(true){} RCObject& RCObject::operator=(const RCObject&) { return *this; } RCObject::~RCObject(){} void RCObject::addReference() { ++refCount; } void RCObject::removeReference() { if(--refCount==0) delete this; } bool RCObject::isShareable() const { return shareable; } bool RCObject::isShared() const { //引用最少为2才被引用了,否则只有自身 return refCount>1; } //实现文件RCPtr template<class T> void RCPtr<T>::Init() { if(pointee==0) return; if(!pointee->isShareable()) { pointee = new T(*pointee); } pointee->addReference(); } template<class T> RCPtr<T>::RCPtr(T* realPtr):pointee(realPtr) { Init(); } template<class T> RCPtr<T>::RCPtr(const RCPtr<T>& rhs):pointee(rhs.pointee) { init(); } template<class T> RCPtr<T>::~RCPtr() { if(pointee) pointee->RemoveReference(); } template<class T> RCPtr<T>& RCPtr<T>::operator=(const RCPtr& rhs) { if(pointee != rhs.pointee) { if(pointee) pointee->RemoveReference(); pointee = rhs.pointee; Init(); } return *this; } template<class T> T* RCPtr<T>::operator->() const { return pointee; } template<class T> T& RCPtr<T>::operator*() const { return *pointee; } //String::StringValue的实现 void StringValue::Init(const char* initValue) { data = new char[strlen(initValue)+1]; strcpy(data,initValue); } StringValue::StringValue(const char* initValue) { Init(initValue); } StringValue::StringValue(const StringValue& rhs) { Init(rhs.data); } StringValue::~StringValue() { delete []data; } //String的实现 String::String(const char* initValue)value(new StringValue(initValue)) { } const char& String::operator[](int index) const { return value->data[index]; } //由于不能确定非const的[]是读还是写,所以都按照写来操作 //从新分配内存,并设定为不可共享状态 char& String::operator[](int index) { if(value->IsShared()) { value = new StringValue(value->data); } value->MarkUnshareable(); return value->data[index]; }
相关文章推荐
- 基于引用计数的智能指针
- 一种基于引用计数的智能指针的实现
- c++基于引用计数的智能指针实现
- 基于引用计数的智能指针
- 基于引用计数的智能指针实现
- 基于引用计数的智能指针为什么会发生循环引用
- 3.通过AES加密实例(基于c和oc)进一步了解指针
- 在全局函数中得到窗口(基于对话框)的指针
- 使用字符指针实现的一个简单string类
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- 基于C语言中野指针的深入解析
- 智能指针(引用计数)
- String 类的编写:1.各种运算符的重载 2.用引用计数来实现String类
- 基于C++ map中key使用指针问题的详解
- Hihocoder #1014 : Trie树 (字典数树统计前缀的出现次数 *【模板】 基于指针结构体实现 )
- 基于数据成员是指向一个数组的指针来实现的list
- objective-C 编程全解-第05章 基于引用计数的内存管理 上
- 《Objective-C编程全解》 读书笔记 五章 基于引用计数的内存管理
- 关于二级指针的使用测试小例子,仅供测试--参数传递的时候用指针最好,因为压栈的时候指针,只是压入一个地址的值,最多4个字节(32位机上),提供的3个测试例子,基于VC6.0的环境。
- 基于struts2、spring的应用闲置一段时间后报空指针错(转)