模拟实现智能指针
2016-01-19 18:03
218 查看
智能指针:所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。
RAII(Resource Acquisition Is Initialization)
资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
现在来模拟实现一下auto_ptr,scoped_ptr(守卫,即是防拷贝),shared_ptr(使用引用计数)
智能指针:所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。
RAII(Resource Acquisition Is Initialization)
资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
现在来模拟实现一下auto_ptr,scoped_ptr(守卫,即是防拷贝),shared_ptr(使用引用计数)
#include <iostream> using namespace std; //auto_ptr template<typename T> class AutoPtr { public: AutoPtr(T *ptr) :_ptr(ptr) {} AutoPtr(AutoPtr<T>& ap) :_ptr(ap._ptr) { ap._ptr = NULL; } AutoPtr<T>& operator=(AutoPtr<T>& ap) { if(_ptr != ap._ptr) { delete _ptr; _ptr = ap._ptr; ap._ptr = NULL; } return *this; } T& operator*() { return *_ptr; } T* operator->() { return _ptr; } ~AutoPtr() { delete _ptr; } private: T *_ptr; }; //scoped_ptr template<typename T> class ScopedPtr { public: ScopedPtr(T *ptr) :_ptr(ptr) {} T& operator*() { return *_ptr; } T* operator->() { return _ptr; } ~ScopedPtr() { delete _ptr; } protected: ScopedPtr(ScopedPtr<T>& sp); ScopedPtr<T>& operator=(ScopedPtr<T>& sp); private: T *_ptr; }; //shared_ptr template<typename T> class SharedPtr { public: SharedPtr(T *ptr) :_ptr(ptr) ,_pcount(new int(1)) { } SharedPtr(SharedPtr<T>& sp) :_ptr(sp._ptr) ,_pcount(sp._pcount) { (*_pcount)++; } SharedPtr<T>& operator=(SharedPtr<T>& sp) { if(_ptr != sp._ptr) { if(--(*_pcount) == 0) { delete _pcount; delete _ptr; } _ptr = sp._ptr; _pcount = sp._pcount; (*_pcount)++; } return *this; } T& operator*() { return *_ptr; } T* operator->() { return _ptr; } ~SharedPtr() { if(--(*_pcount) == 0) { delete _ptr; delete _pcount; } } private: T *_ptr; int *_pcount; }; void Test1() { int *p1 = new int(1); int *p2 = new int(2); AutoPtr<int> ap1(p1); AutoPtr<int> ap2(ap1); ap2 = ap1; } void Test2() { int *p1 = new int(1); int *p2 = new int(2); ScopedPtr<int> sp1(p1); //ScopedPtr<int> ap4(ap3); } void Test3() { int *p1 = new int(1); int *p2 = new int(2); SharedPtr<int> sp1(p1); SharedPtr<int> sp2(sp1); SharedPtr<int> sp3(p2); sp3 = sp1; } int main() { //Test1(); //Test2(); Test3(); return 0; }
相关文章推荐
- /dev/mapper/VolGroup-lv_root: unexpected inconsistency; run fsck manually 解决办法
- BAT的真的适合创业团队吗?
- maven多模块项目搭建
- 原型链与Object和Function
- C# 基础数据与Byte
- centos 下配置 yum 全!
- 基于HashedWheelTimer的一个定时器实现
- 2510: 存钱
- mysql命令行中文显示乱码和输出表格不能对齐解决办法
- BAT的真的适合创业团队吗?
- myEclipse 开发的项目导入到eclipse中运行
- mysql 一行转多行
- CentOS下Git的服务器版安装和使用
- python 函数操作
- spring MVC配置详解
- android面试题
- 2015年出现的十大流行Django库
- linux下配置本地yum源仓库
- cordova ios 上下拖动黑边
- LoTVideo:只需两步,让HTML5原生态的Video茁壮成长