当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。
智能 指针 (smart pointer)的一种通用实现技术是使用 引用计数 (reference count)。智能 指针 类将一个计数器与类指向的对象相关联, 引用计数 跟踪该类有多少个对象共享同一指针。
为了避免上面方案中每个使用指针的类自己去控制引用计数,可以用一个类把指针封装起来。封装好后,这个类对象可以出现在用户类使用指针的任何地方,表现为一个指针的行为。我们可以像指针一样使用它,而不用担心普通成员指针所带来的问题,我们把这样的类叫句柄类。在封装句柄类时,需要申请一个动态分配的引用计数空间,指针与引用计数分开存储。
智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。
事实上,智能 指针 能够做的还有很多事情,例如处理 线程安全 ,提供写时复制,确保协议,并且提供远程交互服务。有能够为这些ESP (Extremely Smart Pointers)创建一般智能 指针 的方法,但是并没有涵盖进来。 智能 指针 的大部分使用是用于生存期控制,阶段控制。它们使用operator->和operator*来生成原始 指针 ,这样智能指针看上去就像一个普通指针。 这样的一个类来自标准库:std:: auto_ptr 。它是为解决资源所有权问题设计的,但是缺少对引用数和 数组 的支持。并且,std:: auto_ptr 在被复制的时候会传输所有权。在大多数情况下,你需要更多的和/或者是不同的功能。这时就需要加入smart_ptr类。