标题:C++智能指针


智能指针的实现也是C++中的热点知识,它所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理,因此不用担心内存泄露的问题。智能指针经常出现在各种C++面试中,要求你说出智能指针的优缺点,甚至让你实现一份自己的智能指针。在C++编程领域里,有两份智能指针的实现:auto_ptrshared_ptr。它们的声明方式如下:

       auto_ptr<T>         ptr (new Y );

       shared_ptr<T>              ptr (new X);

智能指针并非完美无缺。比如auto_ptr,就存在下面一些问题:

1.  auto_ptr不能共享所有权。

一旦智能指针被拷贝或者赋值,如:

auto_ptr <type> pt1(new type);

auto_ptr<type> pt2 = pt1; //拷贝

auto_ptr<type> pt3;

pt3 = pt1; //赋值

    这样会导致pt2pt3pt1同时指向pt1内部的原始指针。由于每一个auto_ptr在被销毁时都会删除其所指之物,就意味着原始指针会被重复删除3次,造成严重后果。为了解决这个问题,要么禁用拷贝与赋值操作符,要么设计为当auto_ptr被拷贝或者赋值时对原始指针的拥有权转移到新对象上去。

2.  auto_ptr不能指向数组。

3.  auto_ptr不能作为容器的成员。

4.  auto_ptr不能通过赋值操作来初始化:

std::auto_ptr<int> p(new int(42));     //

std::auto_ptr<int> p = new int(42);    //

   

但是,在shared_ptr中,已经解决了auto_ptr中的大部分问题。很多朋友可能还不是很熟悉shared_ptr,其实它是Boost库中提供的一个新的智能指针,引用头文件为:#include<boost/shared_ptr.hpp>Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,其成员已近2000人。 Boost库为大家带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。要使用Boost库,必须要先安装该库。

    上面介绍并比较了智能指针的特点。实际上,auto_ptrshare_ptr都有现成的代码供大家阅读。但是为了锻炼大家面向对象的程序设计能力,下面给出一分关于智能指针的简单实现方法,以加深对C++编程的理解。

       概括起来,指针的运算包含:“->”,“*”,“!”以及它的普通构造函数,拷贝构造函数,析构函数,以及赋值运算符。所以在智能指针中,需要实现这些基本功能。

 

template <class T>

class SmartPtr

{

public:

     SmartPtr (T * realPtr = 0): pointee(realPtr)

     {

     }

     SmartPtr(SmartPtr<T> &rhs);

     ~SmartPtr()

     {

         delete pointee;

     }

     SmartPtr &operator = (SmartPtr<T> rhs);

     T * operator->() const;

     T& operator*() const;

     bool operator!() const;

private:

     T *pointee;

};

template <class T>

SmartPtr<T>::SmartPtr (SmatrtPtr<T> &rhs)

{

     pointee = rhs.pointee;

     //拥有权发生转移

     rhs.pointee = NULL;

}

SmartPtr<T> & SmartPtr<T>::operator = (SmartPtr<T> &rhs)

{

     If (this == &rhs)

         return *this;

     delete pointee;

     pointee = rhs.pointee;

     //拥有权发生转移

     rhs.pointee = 0;

     return *this;

}

T *SmartPtr<T>::operator->() const

{

     return pointee;

}

T & SmartPtr<T>::operator *() const

{

     return *pointee;

}

bool SmartPtr<T>::operator!() const

{

     return pointee == NULL;

}




看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注