模拟实现智能指针

来源:互联网 发布:开淘宝网店计划书 编辑:程序博客网 时间:2024/06/08 11:52

智能指针可以用来管理资源,原自构造析构函数(RAII);还可以像原生指针一样使用。

本文为模拟实现auto_ptr,scoped_ptr,shared_ptr,下面为这些指针的特点:

auto_ptr: 管理权限的转移。

scoped_ptr: 防拷贝。

shared_ptr:引用计数解决auto_ptr的缺陷。

其中shared 自身带有一定缺陷,循环引用,和不可释放数组类,文件类等资源,幸运的是它支持定制删除器,以及使用weak_ptr

关于资源管理:https://github.com/DecVan/EffictiveCplus/tree/chapter_3 有兴趣可以看看,以下为上述智能指针实现代码。

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 (this != &ap){delete _ptr;_ptr = ap._ptr;//管理权限转移ap._ptr = NULL;}return *this;}T& operator*(){return *_ptr;}T* operator->(){return _ptr;}~AutoPtr(){if (_ptr){delete _ptr;_ptr = NULL;}}private:T* _ptr;};class TestClass{public:TestClass(int a = 0):_a(a){}public:int _a;};
scoped_ptr:

template<typename T>class ScopedPtr{public:ScopedPtr(T* ptr):_ptr(ptr){}T& operator*(){return *_ptr;}T* operator->(){return _ptr;}~ScopedPtr(){if (_ptr){delete _ptr;_ptr = NULL;}}protected://禁止拷贝ScopedPtr(const ScopedPtr<T>& sp);ScopedPtr<T> operator=(const ScopedPtr<T>& sp);private:T* _ptr;};

shared_ptr:


//用以解决释放非基本类型//以数组为例template<typename T>struct deleteArry{void operator()(T* ptr){delete[] ptr;}};//解决循环引用,见上图。template <typename T>class weak_ptr{T* _ptr;public:weak_ptr(const shared_ptr<T>& sp):_ptr(sp._Ptr){}};template<typename T>class SharedPtr{public:SharedPtr(T* ptr):_ptr(ptr), _count(new int(1)){}SharedPtr(SharedPtr<T>& sp):_ptr(sp._ptr), _count(sp._count){(*_count)++;}SharedPtr<T>& operator=(SharedPtr<T>& sp){if (_ptr != sp._ptr)//防止自我赋值{if ( (*_count)-- == 1){delete _ptr;delete _count;}_ptr = sp._ptr;_count = sp._count;(*_count)++;}return *this;}T& operator*(){return *_ptr;}T* operator->(){return _ptr;}~SharedPtr(){if (_ptr){if ((*_count)-- == 1){delete _ptr;delete _count;}_ptr = NULL;_count = NULL;}}private:T* _ptr;int* _count;};




0 0