智能指针概述:
智能指针用来管理动态对象。其行为类似于常规指针,重要的差别是:它负责自己主动释放所指向的对象。
C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr
差别是:shared_ptr同意多个指针指向同一个对象;unique_ptr则独占所指向的对象。
另外。另一种weak_ptr的伴随类,它是一种弱引用。指向shared_ptr所管理的对象。
自己定义智能指针实现方法:
实现方法使用引用计数方法。
智能指针将一个计数器与类指向的对象相关联,引用计数跟踪一共同拥有多少个类对象共享同一指针。
实现要点:
- 每次创建类的新对象的时候,初始化指针并将引用计数置为1。
- 当对象作为还有一对象的副本而创建的时候,也就是拷贝构造时候,拷贝构造函数拷贝指针并添加与之相应的引用计数;
- 当对一个对象进行赋值操作的时候,赋值操作符 降低左操作数所指对象的引用计数(若引用计数减为0,则删除该对象),并添加右操作数指向对象的引用计数(由于左側指针指向了右側指针指向的对象,所以右側指针指向的对象的引用计数添加1);
- 调用析构函数时候,降低引用计数(若减为0。则删除基础对象);
实现智能指针有两种经典策略:一是引入辅助类,二是使用句柄类。
以下样例使用辅助类来实现:
#include"iostream" using namespace std; //定义一个普通类 class bookClass{ private: string name; int price; public: int getPrice(){ return price; } }; //辅助类 class Counter { private: friend class smartPoint; Counter(bookClass *book) :bk(book), count(1){}; ~Counter(){ delete bk; }; int count; bookClass* bk; }; //智能指针类 class smartPoint { public: smartPoint(bookClass *bkC) :RpCnt(new Counter(bkC)){} smartPoint(const smartPoint &sp) :RpCnt(sp.RpCnt){ ++RpCnt->count; } smartPoint& operator= (const smartPoint& rhs) { ++rhs.RpCnt->count; if (--RpCnt->count == 0) delete RpCnt; RpCnt = rhs.RpCnt; return *this; } ~smartPoint(){ if (--RpCnt->count == 0) delete RpCnt; } private: Counter *RpCnt; };
上述代码,实现了一个简单的智能指针类。可编译执行,逐条对照实现要点中的要求。