智能指针

在类中有指针成员时,使用复制拷贝函数可以使每一个类的对象都有一份自己的指针成员指向的拷贝,以防止如果被拷贝的对象XIGOU,复制的对象的指针成员成为野指针。

另一种避免这种结果的途径就是智能指针。智能指针的一种实现方式是指针成员所指空间建立一个计数器,而不是区复制这个空间。每当这个拥有这个指针成员的对象被复制一次,这个计数器就加1.

具体情况是这么个样子:

代码:

#include <iostream>
using namespace std;

class RefPtr
{
public:
    friend class TestPtr;
    int *ptr;
    size_t count;
    RefPtr(int *p):ptr(p),count(1){}
    ~RefPtr(){delete ptr;}
};

class TestPtr
{
public:
    TestPtr(int *p):ptr(new RefPtr(p)){}
    TestPtr(const TestPtr &src):ptr(src.ptr){ ++ptr->count;}
    TestPtr& operator=(const TestPtr &rhs)
    {
        ++rhs.ptr->count;
        if(--ptr->count == 0)
            delete ptr;
        ptr = rhs.ptr;
        return *this;
    }
    ~TestPtr() {delete ptr;}
//private:
    RefPtr *ptr;
};


int main()
{
    int a = 123456;
    TestPtr t1(&a);
    TestPtr t2 = t1;
    TestPtr t3 = t2;

    cout << "num of count is : " << t1.ptr->count << endl;
    cout << "num of count is : " << t2.ptr->count << endl;
    cout << "num of count is : " << t3.ptr->count << endl;
    return 0;
}
截图不方便,运行结果如下:

num of count is : 3

num of count is : 3

num of count is : 3

所以从t1复制出来的t2,从t2复制出来的t3,它们所指向的空间都是一块,就是RefPtr*,所以RefPtr*中的count自然都是相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值