带引用计数的智能指针实现

    自己实现的智能指针:

    优点:有引用计数,可以实现指针间共享一个对象。

    缺点:不能实现数组的动态分配。


    auto_cptr.h:

#ifndef _AUTO_CPTR_H_
#define _AUTO_CPTR_H_

//#define __debug
// auto_cptr.h
// 带引用计数的智能指针
#include <iostream>
using namespace std;



template <typename T>
class auto_cptr
{
public:
    auto_cptr():p(0),count(0)
    {
        #ifdef __debug
        cout<<"auto_cptr():empty construction of auto_cptr"<<endl;
        #endif
    }
    
    template <typename U>
    explicit auto_cptr(U *pu):p( (T*)pu ),count(0)
    {

        if(pu)
        {
            count=new size_t;
            *count = 1;
            #ifdef __debug
            cout<<"auto_cptr(U *pu): construction of auto_cptr, obj="<<p<<", count="<<get_count()<<"  "<<endl;
            #endif
        }else
        {
            #ifdef __debug
            cout<<"auto_cptr(U *pu): construction of auto_cptr, null=null"<<endl;
            #endif
        }
    }
    
    auto_cptr(const auto_cptr<T>& cp):p( 0 ),count(0)
    {

        copyfrom(cp);
        #ifdef __debug
        cout<<"auto_cptr(const auto_cptr<T>& cp):copy construction of auto_cptr.obj="
        <<p<<", count="<<get_count()<<"  "<<endl;
        #endif
    }
    

    auto_cptr<T>& operator=(const auto_cptr <T>&cp)
    {
        if(&cp==this)
            return *this;
        copyfrom(cp);
        #ifdef __debug
        cout<<"auto_cptr::operator=:operator"<<"obj="<<p<<", count="<<get_count()<<"  "<<endl;
        #endif
        
        return *this;
    }

    ~auto_cptr()
    {
        #ifdef __debug
        cout<<"~auto_cptr()"<<endl;
        #endif
        minus();
    }
    
    friend bool operator==(const auto_cptr<T>&p1,const auto_cptr<T>&p2)
    {
        return p1.p==p2.p && p1.count==p2.count;
    }
    friend bool operator!=(const auto_cptr<T>&p1,const auto_cptr<T>&p2)
    {
        return !(p1==p2);
    }
    
    T *operator->() {return &(operator*());}
    T &operator*() {return *p;}
    
    size_t get_count()
    {
        return count?*count:0;
    }
    
    T* get_pvalue()
    {
        return p;
    }
    
private:
    void copyfrom(const auto_cptr<T> &cp)
    {
        minus();
        if(cp.p)
        { 
            p=cp.p;
            count=cp.count;
            ++(*count);

        }    
    } 
    
    void minus()
    {
        if(p==0)
            return;
        --(*count);
        if(*count<=0)
        {
            #ifdef __debug
            cout<<"auto_cptr::minus(): delete "<<endl;
            #endif
            delete p;
            delete count;
        }else
        {
            #ifdef __debug
            cout<<"auto_cptr::minus():not delete, p="<<p<<", count="<<get_count()<<"  "<<endl;
            #endif
        }
        
        p=0;
        count=0;
    }
    
private:
    T  *p;
    size_t *count;
};

#endif

测试:main.c:


#include <iostream>

#define __debug   // 打印智能指针的调试信息
#include "auto_cptr.h"
using namespace std;

// 测试类

class A

{

public:

    A(){cout<<"empty construction"<<endl;}

    A(int a_){cout<<"non-empty construction"<<endl;_a=a_;}

    ~A(){cout<<"deconstruction"<<endl;}
    void display(){cout<<"A::display()"<<endl;}

    friend ostream &operator<<(ostream &os, const A&a);    

    private:

    int _a;

};


ostream &operator<<(ostream &os, const A&a)

{

    cout<<a._a;

    return os;

}




int main()

{

    

    auto_cptr<A> p1=auto_cptr<A> (new A(5) );

    auto_cptr<A> p2=p1; // 拷贝构造
    auto_cptr<A>p3;     // 空的智能指针
    p3=p2;              // 智能指针的赋值
    
    p2=auto_cptr<A>();  // 空对象赋值给p2

    cout<<"指针指向的对象值: "<<*p3<<endl;              // operator *
    cout<<"通过智能指针调用函数: ";   p3->display();    // operator ->
    
    

    return 0;

}


运行:

chen@chen-book1:~$ gcc c.cpp -lstdc++ -o cpp -g
chen@chen-book1:~$ ./cpp
non-empty construction
auto_cptr(U *pu): construction of auto_cptr, obj=0x9c3c008, count=1  
auto_cptr(const auto_cptr<T>& cp):copy construction of auto_cptr.obj=0x9c3c008, count=2  
auto_cptr():empty construction of auto_cptr
auto_cptr::operator=:operatorobj=0x9c3c008, count=3  
auto_cptr():empty construction of auto_cptr
auto_cptr::minus():not delete, p=0x9c3c008, count=2  
auto_cptr::operator=:operatorobj=0, count=0  
~auto_cptr()
指针指向的对象值: 5
通过智能指针调用函数: A::display()
~auto_cptr()
auto_cptr::minus():not delete, p=0x9c3c008, count=1  
~auto_cptr()
~auto_cptr()
auto_cptr::minus(): delete 
deconstruction
chen@chen-book1:~$ 




源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值