智能指针—AutoPtr,ScopedPtr,SharedPtr的模拟实现
来源:互联网 发布:手机淘宝背景怎么设置 编辑:程序博客网 时间:2024/05/17 04:24
智能指针: 所谓智能指针就是智能/⾃动化的理指针所指向的动态资源的释放
AutoPtr:最简单的智能指针
首先我们先提一下RAII,资源获得即初始化(利用类的构造函数来进行初始化和析构函数释放资源)
下面我们来模拟实现以下AutoPtr
//智能指针AutoPtrtemplate <class T>class AutoPtr{pubilc: AutoPtr (T * ptr) :_ptr(ptr) { } ~AutoPtr() { cout << "delete" << _ptr << endl; if (_ptr) { delete _ptr; _ptr = NULL; } }private : T = _ptr;}
如果执行会发现以上代码是有问题的,拷贝构造函数和赋值运算符重载是系统默认的,系统默认情况下是值拷贝,存在一块空错放两次及以上的情况,导致程序运行错况。
在这里,采用的方法是管理权的转移。
AutoPtr(AutoPtr<T>& ap){//管理权的转移this->_ptr=ap._ptr;ap._ptr=NULL;}
但是还是尽量不要使用它,其是存在缺陷的。
ScoPedPtr:简单粗暴—防拷贝(只声明不定义)
template <class T> class ScopedPtr { public: ScopedPtr(T * ptr) :_ptr(ptr) { } ~ScopedPtr() { cout << "delete" << endl; if (_ptr) { delete _ptr; _ptr = NULL; } } T & operator*() { return *_ptr; } T* operator->() { return _ptr; } T* GetPtr() { return _ptr; } protected: //防止拷贝 ScopedPtr(ScopedPtr<T> & ap); ScopedPtr<T> & operator=(ScopedPtr<T> & ap); private: T * _ptr; };
SharedPtr:利用引用计数的浅拷贝来实现 缺陷为循环引用(weak_ptr配合解决)
template <class T> //智能指针sharedptr class SharedPtr { public: SharedPtr(T * ptr) :_ptr(ptr) , _pcount(new long(1)) { } ~SharedPtr() { cout << "delete" << endl; if (--(*_pcount) == 0) { delete _ptr; delete _pcount; } } SharedPtr(SharedPtr<T> & ap) :_ptr(ap._ptr) , _pcount(ap._pcount) { ++(*_pcount); } SharedPtr<T> & operator=(SharedPtr<T> & ap) { if (this != &ap) { if (--(*_pcount) == 0) { delete _ptr; delete _pcount; } _ptr = ap._ptr; _pcount = ap._pcount; ++(*_pcount); } return *this; } private: T * _ptr; long *_pcount; //实现引用计数 };
0 0
- 智能指针—AutoPtr,ScopedPtr,SharedPtr的模拟实现
- 智能指针(模拟实现AutoPtr、ScopedPtr、SharedPtr)
- 智能指针 AutoPtr ScopedPtr SharedPtr
- 智能指针AutoPtr,ScopedPtr的模拟实现
- 智能指针——AutoPtr & ScopedPer & SharedPtr & WeakPtr
- 引用计数的智能指针——sharedptr的模拟实现
- 智能指针ScopedPtr
- 智能指针2--ScopedPtr
- 智能指针之scopedptr
- 智能指针SharedPtr
- 智能指针3---SharedPtr
- 智能指针AutoPtr
- 智能指针1---AutoPtr
- 智能指针-----AutoPtr
- 智能指针----ScopedPtr和ScopedPtrArray
- 模拟实现定制删除器的SharedPtr
- C++ SharedPtr 智能指针操作二维数组的细节异同
- 智能指针的模拟实现
- Linux下安装python-opencv
- poj1228 Grandpa's Estate【凸包稳定性判断】
- LabVIEW sum累加for循环实例
- gdb调试
- input类型过滤
- 智能指针—AutoPtr,ScopedPtr,SharedPtr的模拟实现
- 检测对象中属性的存在与否可以通过3种方法来判断。
- SSH面试题
- spring中@value
- 《数据结构之线性篇》-线性表的C++实现
- 密码输入的显示和隐藏(显示*)
- Android APP安装后直接打开,点击MENU进入系统主菜单,APP无法再次启动的问题
- Linux下安装OpenCV+Python支持
- Java实现POS打印机无驱打印(转)