智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr
2016-05-29 21:36
429 查看
RAII(Resource Acquisition Is Initialization)
资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
智能指针:用自动化或者说智能的指针来实现对动态内存的释放。它是一个类,有类似指针的功能。
常见的智能指针:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,由于scoped_array和scoped_ptr比较类似,shared_array和shared_ptr又比较类似,所以我们只实现auto_ptr/scoped_ptr/shared_ptr。
一、auto_ptr
最开始auto_ptr的成员变量主要有T* _ptr,bool _owner,主要实现原理是在构造对象时赋予其管理空间的所有权,在析构函数中通过_owner的真否来释放所有权,并且在拷贝或赋值后通过将_owner设为false,转移空间的所有权。具体实现代码如下:
scoped_ptr的实现原理是防止对象的拷贝与赋值。具体实现是将拷贝构造函数和赋值运算符重载函数设置为保护或私有,并且只声明不实现,设置为保护或私有是防止他人在类外自己实现。具体代码如下:
template <typename T>
class ScopedPtr
{
public:
ScopedPtr(T* ptr = NULL);
~ScopedPtr();
T* operator->()const;
T& operator*()const;
T* GetPtr()const;
protected:
ScopedPtr(const ScopedPtr<T>& ptr);
ScopedPtr<T>& operator=(const ScopedPtr<T>& ptr);
protected:
T* _ptr;
};
template <typename T>
ScopedPtr<T>::ScopedPtr(T* ptr) :_ptr(ptr)
{}
template <typename T>
ScopedPtr<T>::~ScopedPtr()
{
if (this->_ptr)
{
delete this->_ptr;
}
}
template <typename T>//应用于类型为结构体时
T* ScopedPtr<T>::operator->()const
{
return this->_ptr;
}
template <typename T>
T& ScopedPtr<T>::operator*()const
{
return *(this->_ptr);
}
template <typename T>
T* ScopedPtr<T>::GetPtr()const
{
return (this->_ptr);
}[/code]shared_ptr的实现及相关问题见下篇博客。
资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
智能指针:用自动化或者说智能的指针来实现对动态内存的释放。它是一个类,有类似指针的功能。
常见的智能指针:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,由于scoped_array和scoped_ptr比较类似,shared_array和shared_ptr又比较类似,所以我们只实现auto_ptr/scoped_ptr/shared_ptr。
一、auto_ptr
最开始auto_ptr的成员变量主要有T* _ptr,bool _owner,主要实现原理是在构造对象时赋予其管理空间的所有权,在析构函数中通过_owner的真否来释放所有权,并且在拷贝或赋值后通过将_owner设为false,转移空间的所有权。具体实现代码如下:
template <typename T> class AutoPtr { public: AutoPtr(); AutoPtr(T* ptr); AutoPtr(AutoPtr<T>& ap); AutoPtr<T>& operator=(AutoPtr<T>& ap); ~AutoPtr(); T& operator*()const; T* operator->()const; T* GetStr()const; protected: T* _ptr; }; template <typename T> AutoPtr<T>::AutoPtr() : _ptr(NULL) {} template <typename T> AutoPtr<T>::AutoPtr(T* ptr) : _ptr(ptr)//不能写成const T* ptr,因为否则为const类型的赋值给非const类型 {} template <typename T> AutoPtr<T>::AutoPtr(AutoPtr<T>& ap) : _ptr(ap._ptr) { ap._ptr = NULL; } template <typename T> AutoPtr<T>& AutoPtr<T>::operator=(AutoPtr<T>& ap) { if (this != &ap) { delete this->_ptr; this->_ptr = ap._ptr; ap._ptr = NULL; } return *this; } template <typename T> AutoPtr<T>::~AutoPtr() { if (this->_ptr) { delete this->_ptr; } } template <typename T> T& AutoPtr<T>::operator*()const { return *(this->_ptr); } template <typename T> T* AutoPtr<T>::operator->()const { return this->_ptr; } template <typename T> T* AutoPtr<T>::GetStr()const { return (this->_ptr); }二、scoped_ptr
scoped_ptr的实现原理是防止对象的拷贝与赋值。具体实现是将拷贝构造函数和赋值运算符重载函数设置为保护或私有,并且只声明不实现,设置为保护或私有是防止他人在类外自己实现。具体代码如下:
template <typename T>
class ScopedPtr
{
public:
ScopedPtr(T* ptr = NULL);
~ScopedPtr();
T* operator->()const;
T& operator*()const;
T* GetPtr()const;
protected:
ScopedPtr(const ScopedPtr<T>& ptr);
ScopedPtr<T>& operator=(const ScopedPtr<T>& ptr);
protected:
T* _ptr;
};
template <typename T>
ScopedPtr<T>::ScopedPtr(T* ptr) :_ptr(ptr)
{}
template <typename T>
ScopedPtr<T>::~ScopedPtr()
{
if (this->_ptr)
{
delete this->_ptr;
}
}
template <typename T>//应用于类型为结构体时
T* ScopedPtr<T>::operator->()const
{
return this->_ptr;
}
template <typename T>
T& ScopedPtr<T>::operator*()const
{
return *(this->_ptr);
}
template <typename T>
T* ScopedPtr<T>::GetPtr()const
{
return (this->_ptr);
}[/code]shared_ptr的实现及相关问题见下篇博客。
相关文章推荐
- Linux中文件的查找whereis、locate、find
- Linux下vim的配置
- shell(十一)切割文件
- [平衡树动态维护凸包] BZOJ 2300 [HAOI2011]防线修建
- 根文件系统制作
- [ZooKeeper]ZooKeeper.multi的Op和OpResult
- 建立目标板Linux系统
- ARM Linux从Bootloader、kernel到filesystem启动流程
- Busybox ---------- init进程解析
- Linux lvm方式管理磁盘(将多块小盘组合成大盘)
- Liux入门:简单的程序编写(进度条)
- 网卡驱动设计---架构分析加回环网卡驱动设计(网卡驱动上)
- Linux驱动开发、22-USB子系统
- Open judge 07和为给定数
- 【多线程编程】Linux下线程池C实现
- Linux Mint 17 fcitx输入法配置
- Apache Flink fault tolerance源码剖析(二)
- Linux中的计划任务-Crontab
- dlopen、dlsym和dlclose的使用和举例
- Linux驱动开发、21-块设备驱动设计