使用计数类(使用计数是一个名次,亲)主要为了更好的管理于包含指针的类,包含指针的类特别要注意复制控制,注意如下情况
管理类中的指针,应该遵循以下四个规则:
- 每次创建类的新的对象的时,初始化指针并将使用计数置为1。
- 当对象作为另一对象的副本而建立时,复制构造函数复制相应指针并增加与之相应的使用计数的值。从copy-constructor 入手
- 对一个对象进行赋值的时候,赋值操作符减少左操作数所指对象的使用计数的值(如果为使用计数减少为 0,则删除对象),并增加右操作数所指对象的使用计数的值。从重载 operator = 入手。
- 调用析构函数的时候,析构函数减少使用计数的值,(如果使用计数减少至0, 则删除对象)。
定义智能指针类:
1. 计数器 不能放在当前类中,可以使用友元。
#include<cstddef>
class U_Ptr{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p):ip(p),use(1){}
~U_Ptr(){delete ip;};
};
class HasPtr{
public:
HasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i){}
HasPtr(const HasPtr &orig):ptr(orig.ptr),val(orig.val){++ptr->use;}
HasPtr &operator=(const HasPtr&);
~HasPtr(){if(--ptr->use == 0)delete ptr;};
private:
U_Ptr *ptr;
int val;
};
HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
++rhs.ptr->use;
if(--ptr->use == 0)delete ptr;
ptr = rhs.ptr;
val = rhs.val;
return *this;
}
int main()
{
int *obj = new int(42);
HasPtr p1(&obj,10);
HasPtr p2(p1);
HasPtr p3(p1);
}