智能指针简单的说它就是有指针和智能两个方面。首先是个指针,其次这个指针有着比平常指针更智能的方面,至于这些智能方面是如何体现的我们在这里一一来讨论:
智能指针在CPP下就是一个行为类似指针的模版类对象,要注意的是在定义智能指针对象的时候不能定义成指针对象。如果想要使用库中的auto_ptr,必须引入到头文件memory,这个文件是模版定义。下面我们来看看auto_otr智能指针的源码,通过解读代码来熟悉这个指针指针模版:
/*说明:
这里的代码是通过阅读源码,在源码的基础上附加了一个在这里称为拥有权的bool数据成员,
在这了起到的左右就是通过判断对象是否又拥有权来对空间进行是否时释放的的操作,达到了可以让两个或
者多个对象指向同一个空间,但是只有其中一个对象对给空间又拥有权,也只有这个对象才可以释放空间,
代码中详见*/
#include<iostream>
using namespace std;
template<class _ty>
class auto_ptr
{
public:
explicit auto_ptr(_ty* p=0) : _Owns(p!=0), px(p)//explicit 拒绝隐式转换
{}
auto_ptr(const auto_ptr<_ty> &r)
{
if(r._Owns)
_Owns = 1;
px = r.release();
}
auto_ptr& operator = ( const auto_ptr &r)
{
if( this != &r)
{
if(r._Owns)
_Owns = 1;
reset(r.release());//release会把r的拥有权通过强转设置为0
}
return *this;
}
~auto_ptr()
{
if(_Owns)//判断是否又拥有权,只有拥有权的的才能释放
{
delete px;
}
}
public:
_ty operator *()
{
if(px == 0)
{
cout<<"auto_ptr not dereferencable"<<endl;
}
return (*get());//
}
_ty operator->()
{
if(px == 0)
{
cout<<"auto_ptr not dereferencable"<<endl;
}
return (get());//
}
public:
_ty *get()
{
return px;
}
_ty* release()const
{
if(_Owns != 0)
((auto_ptr<_ty>*)this)->_Owns = 0;
//(const_cast<auto_ptr<_ty>*>this)->_Owns = 0;
return px;
}
void reset(_ty *p = 0)
{
if(px != p && _Owns)
delete px;
px = p;
}
private:
bool _Owns;
_ty* px;
};
int main()
{
int *p = new int(10);
auto_ptr<int> q(p);
auto_ptr<int> q1 = q;
auto_ptr<int> q2;
q2 = q1;
return 0;
}
auto_ptr无法达到的:
1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。(这里的可以)
2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[],如果想要指向数组需要自己编写一段代码来实现。
3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr。
4)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权,那么source与sink元素之间就不等价了。
体会: 通过阅读优秀代码我们才能有所提高,通过阅读和体会别人代码算法的精髓比我们自己在那冥思苦想写出来的三流代码提升更高,通过琢磨别人写高级代码的算法精妙,同样是处理一种情况但是由于代码的不同可能会是程序在美观上甚至是在内存空间占用和执行时间上有着天差地别的差距,所以我们平时与其在那冥思苦想和钻研自己的三流代码不如提高自己不如通过阅读别人写的一流代码来提升自己。