智能指针显然是C++吸引人的地方之一,必须掌握。看了《C++primer》,里面着重讲了智能指针的实现方式。
书中说到:
“HasPtr(注:就是自定义的智能指针)在其它方面的行为与普通指针一致。具体而言,复制对象时,副本和原对象将指向同一基础对象。如果通过一个副本改变基础对象,则通过另一个对象访问的值也会改变。
新的HasPtr类需要一个析构函数来删除指针。但是,析构函数不能无条件的删除指针。”
条件就是引用计数。如果该对象被两个指针所指,那么删除其中一个指针,并不会调用该指针的析构函数,因为此时还有另外一个指针指向该对象。看来,智能指针主要是预防不当的析构行为,防止出现悬垂指针。
如上图所示,HasPtr就是智能指针,U_Ptr为计数器,定义如下:
里面有个变量use和指针ip: use记录了*ip对象被多少个HasPtr对象所指。假设现在又两个HasPtr对象p1,p2指向了U_Ptr,那么现在我delete p1,use变量将自减1,class U_Ptr { friend class HasPtr; int *ip; size_t use; U_Ptr(int *p) : ip(p), use(1) { cout << "U_ptr constructor called !" << endl; } ~U_Ptr() { delete ip; cout << "U_ptr distructor called !" << endl; } };