【C++】智能指针的原始写法、scoped写法、shared写法
2016-05-30 15:04
344 查看
智能指针的三种常见写法:
一、最开始的原始写法,原始写法可以理解为指针转移的方法。
这种方法考虑了深浅拷贝问题并且引用了引用计数器来解决浅拷贝的问题,比较完善的实现了智能指针想要实现的功能。
本文出自 “滴水” 博客,请务必保留此出处http://10740329.blog.51cto.com/10730329/1766046
一、最开始的原始写法,原始写法可以理解为指针转移的方法。
template<typename T> class AutoPtr { public: AutoPtr() :_ptr(NULL) {} AutoPtr(T* ptr) :_ptr(ptr) {} ~AutoPtr() { if (_ptr) { delete _ptr; _ptr = NULL; } } AutoPtr<T>(AutoPtr<T>& ap) : _ptr(ap._ptr) { ap._ptr = NULL; } AutoPtr<T>& operator = (AutoPtr<T>& ap) { if (this != &ap) { delete _ptr; _ptr = ap._ptr; ap._ptr = NULL; } return *this; } T& operator*() { return *_ptr; } T* GerPtr() { return _ptr; } private: T* _ptr; };二、演变为后来的scoped写法,又可以称作守卫写法。该写法相对于原始写法的优点在于不让使用拷贝构造和运算符的重载,这样就避免了深浅拷贝的指针问题。做法是把拷贝构造、运算符的重载定声明出来而不定义,并且用protected保护起来。scoped写法是引用的boost库。有兴趣的可以去了解一下这个东西,背后还是有很多故事的,在这我就不多说啦。
template<class T> class scopedPtr { public: scopedPtr() :_ptr(NULL) {} scopedPtr(T* ptr) :_ptr(ptr) {} ~scopedPtr() { if (_ptr) { delete _ptr; _ptr = NULL; } } T& operator*() { return *_ptr; } T* operator->() { return _ptr; } T* GetPtr() { return _ptr; } protected: //加上protected可以防止使用者在类之外定义拷贝构造和运算符的重载函数 scopedPtr<T>(const scopedPtr<T>& sp); //不让使用者使用拷贝,可以防止拷贝,所以只声明不定义 scopedPtr<T>& operator=(const scopedPtr<T>& sp); private: T* _ptr; };三、sharedPtr写法
这种方法考虑了深浅拷贝问题并且引用了引用计数器来解决浅拷贝的问题,比较完善的实现了智能指针想要实现的功能。
template<class T> class SharePtr { public: SharePtr(T* ptr) :_ptr(ptr) , _pCount(new int(1)) {} //SharePtr(Shar) // :_ptr(sp._ptr) //{ // *_pCount = 1; //} ~SharePtr() { if (_ptr) { if (--(*_pCount) == 0) { delete _ptr; delete _pCount; _ptr = NULL; _pCount = NULL; } _ptr = NULL; } } SharePtr<T>(const SharePtr<T>& sp) { _ptr = sp._ptr; _pCount = sp._pCount; ++(*_pCount); } SharePtr<T>& operator=(const SharePtr<T>& sp) { if (this != &sp) { if (--(*_pCount) == 0) //这里要分清楚是谁减一,逻辑需要分析清楚 { delete _ptr; delete _pCount; _ptr = NULL; _pCount = NULL; } _ptr = sp._ptr; _pCount = sp._pCount; ++(*_pCount); } return *this; } private: T* _ptr; int* _pCount; };
本文出自 “滴水” 博客,请务必保留此出处http://10740329.blog.51cto.com/10730329/1766046
相关文章推荐
- 【C语言】【面试题】【笔试题】使用main函数实现一个整数计算器!
- 【C语言】【面试题】【笔试题】模拟实现数据库中memmove函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中memcpy函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中strcpy函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中strcat函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中strcmp函数
- 【C语言】【面试题】【笔试题】二维数组中的查找,杨氏矩阵
- 【C语言】【面试题】【笔试题】模拟实现strstr函数
- 【C语言】在终端输入多行信息,找出包含“ould”的行,并打印改行
- 【C语言】【面试题】【笔试题】编写一个函数实现n^k,使用递归实现
- 【C语言】【面试题】【笔试题】写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
- 【C语言】编写一个函数reverse_string(char * string)(递归实现
- 【C语言】【笔试题】模拟实现strncat
- 【C语言】【面试题】【笔试题】模拟实现strncmp
- 【C语言】【面试题】【笔试题】模拟实现strncpy
- 【C语言】【笔试题】模拟实现memset
- 【C语言】【笔试题】模拟实现memcmp
- 【C语言】【指针相关知识小结】
- 【C语言】【笔试题】使用回调函数编写冒泡排序,可以排序整形数组,也可以排序字符串
- 【C语言】【面试题】C++中String类浅拷贝,深拷贝的传统写法与现代写法