首页 > 其他分享 >手撕智能指针shared_ptr

手撕智能指针shared_ptr

时间:2023-09-15 21:55:06浏览次数:26  
标签:cnt return int Shared shared sptr ptr 指针

#include <bits/stdc++.h>
using namespace std;

class Count {
private:
    int cnt;
public:
    Count() :cnt(1) {}
    ~Count() = default;
    void addcount() { ++cnt; }
    int getcount() { return cnt; }
    int reducecount() { return --cnt; }
};

template <typename T>
class Shared_ptr {
private:
    T* ptr;
    Count* cnt;
public:
    //构造函数
    Shared_ptr(T* pt = nullptr) : ptr(pt) {
        if (pt)
            cnt = new Count();
    }

    //析构函数
    ~Shared_ptr() {
        if (ptr && !cnt -> reducecount()) {
            delete ptr;
            delete cnt;
        }
    }

    //拷贝构造函数
    Shared_ptr(Shared_ptr<T>& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            cnt -> addcount();
        }
    }

    //移动构造函数
    Shared_ptr(Shared_ptr<T>&& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            sptr.ptr = nullptr;
            sptr.cnt = nullptr;
        }
    }

    //拷贝构造运算符
    Shared_ptr& operator=(Shared_ptr& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            cnt -> addcount();
        }
        return *this;
    }

    Shared_ptr& operator=(Shared_ptr<T>&& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            sptr.ptr = nullptr;
            sptr.cnt = nullptr;
        }
        return *this;
    }

    long use_count() {
        if (ptr)
            return cnt -> getcount();
        return 0;
    }
};

int main() {

    Shared_ptr<int> p1(new int(10));
    cout << p1.use_count() << endl;
    Shared_ptr<int> p2(p1);
    cout << p2.use_count() << endl;
    return 0;
}

 

标签:cnt,return,int,Shared,shared,sptr,ptr,指针
From: https://www.cnblogs.com/yzqiang/p/17705990.html

相关文章

  • C++11中的智能指针shared_ptr、weak_ptr源码解析
    https://www.jb51.net/article/224028.htm−目录1、前言2、源码准备3、智能指针概念4、源码解析4.1、shared_ptr解析4.1.1、shared_ptr4.1.2、__shared_ptr4.1.3、__shared_count4.1.4、_Sp_counted_base4.1.5、_Sp_counted_ptr4.1.6、shared_ptr总结4.2、weak......
  • WSL 炼丹报错:Could not load library libcudnn_cnn_infer.so.8. Error: libcuda.so: c
    确认驱动没问题(nvidia-smi可以正常使用)解决办法参照:https://github.com/pytorch/pytorch/issues/85773#issuecomment-1288033297内容如下:......
  • C++11之智能指针(万字长文详解)
    C++11之智能指针为什么需要智能指针#include<iostream>usingnamespacestd;intdiv(){inta,b;cin>>a>>b;if(b==0)throwinvalid_argument("除0错误");returna/b;}voidFunc(){//1、如果p1这......
  • 代码随想录算法训练营第9天| ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结
    28.找出字符串中第一个匹配项的下标mydemo--(mythought)--(falied)classSolution{public:intstrStr(stringhaystack,stringneedle){for(inti=0;i<haystack.size();i++){if(haystack[i]!=needle[0])continue;......
  • 复杂指针解读typedef double(* (* (*p3)() )[10] )()
    1#include<stdio.h>2/*“右左法则”:*/3//*p3指针4//(*p3)()函数指针函数参数列表为()5//*(*p3)()函数指针函数参数列表为()、返回值类型为指针6//(*(*p3)())[10]数组指针指针为函数指针函数参数列表为()、返回值类型为指针7//double(*(*p3......
  • C++11之智能指针(万字长文详解)
    C++11之智能指针为什么需要智能指针#include<iostream>usingnamespacestd;intdiv(){inta,b;cin>>a>>b;if(b==0)throwinvalid_argument("除0错误");returna/b;}voidFunc(){//1、如果p1这......
  • 什么是指针c语言中
    c语言指针自己的看法;因为c语言是面向过程的一门语言和java有所不同(因为之前我就是学的Java),简单来说指针是什么呢,我们都知道,每个变量都有一个,是内存自动分配,java也一样,而c语言的指针是指向内存的地址,具体代码的实现p=&var就相当于取出var的地址保存到p中 那指针有什么......
  • 138. 复制带随机指针的链表
    给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表......
  • 转动指针,转动拨盘
    初始效果图(左), 转动指针效果图(中),转动拨盘效果图(右)   代码如下:intcenterX=124;intcenterY=124;privatevoidForm1_Load(objectsender,EventArgse){varbmp=GetPointerImg(Resources.valsalvaThresholdPointer,......
  • const char *ptr和char const *ptr以及char* const ptr的区别
    constchar*ptr和charconst*ptr =>这里这么理解,这个表示的是*ptr,也就是指针指向的值,而修饰这个指针指向的值(*ptr)的是constchar或者charconst,表示两个意思:const=>表示是个常量,也就是说*ptr这个指针指向的值是个常量char=>表示字符类型,也就是说这个指针指......