管理类中指针,实现使用计数类,两种经典策略

使用计数类(使用计数是一个名次,亲)主要为了更好的管理于包含指针的类,包含指针的类特别要注意复制控制,注意如下情况

管理类中的指针,应该遵循以下四个规则:

  1. 每次创建类的新的对象的时,初始化指针并将使用计数置为1。
  2. 当对象作为另一对象的副本而建立时,复制构造函数复制相应指针并增加与之相应的使用计数的值。从copy-constructor 入手
  3. 对一个对象进行赋值的时候,赋值操作符减少左操作数所指对象的使用计数的值(如果为使用计数减少为 0,则删除对象),并增加右操作数所指对象的使用计数的值。从重载 operator = 入手。
  4. 调用析构函数的时候,析构函数减少使用计数的值,(如果使用计数减少至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);
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值