首页 > 编程语言 >c++ 智能指针

c++ 智能指针

时间:2025-01-23 11:20:36浏览次数:1  
标签:count return ctrl c++ 智能 shared unique ptr 指针

1.  unique_ptr:这种智能指针是用于独占一份内存资源,一个资源也就只允许被一个unique_ptr占用。离开作用域后自动删除,无需显式调用delete。并且不能复制,只能转移。

原理实现:

template <typename T>
class unique_ptr{
private:
    T* ptr;
public:
    explicit unique_ptr(T* p) : ptr(p) { }   //构造函数

    unique_ptr(unique_ptr && other) noexcept:   //移动构造函数
    ptr(other.ptr)    { other.ptr = nullptr; }

    unique_ptr& operator=(unique_ptr &&other) noexcept //重载移动赋值运算符
    {    
        if(this != &other)
        {    delete ptr;  //这里实际上有问题
            ptr = other.ptr;
            other.ptr = nullptr;
        }    
        return *this;            
    }
//事实上,unique_ptr直接禁止了=操作,使用会直接报错,正确的转移行为是用std::move 。此外,拷贝构造函数也被禁用了。
//官方的转移: std::unique_ptr<T> ptr2 = std::move(ptr1); T& operator*() const {return *ptr;} //为什么返回值是&引用?因为这个值在外面需要被修改 T* operator->() const {return ptr;} //析构 ~unique_ptr() {delete ptr;} T* get() const {return ptr;} T* release() { T* temp = ptr; ptr = nullptr; return temp; //temp应该释放,realse本身不应该删除内容 }

 

2. shared_ptr  这种指针可以多个指针指向同一份资源,每多一个指针计数就+1,反之-1,计数为0时删除资源。

class ControlBlock{
   public:
        int shared_count = 0;
        int weak_count = 0;
};  //用于管理引用计数  weak_ptr也会用到

//shared_ptr简单实现
template<typename T>
class sharedptr{
    T* ptr = nullptr;
    ControlBlock* ctrl = nullptr;

public:
    sharedptr(T* p = nullptr): ptr(p){    //构造函数
        if(ptr){
            ctrl = new ControlBlock();
            ctrl->shared_count = 1;
        }
    }
//为什么要设置默认值p=nullptr?因为这样在声明新的指针时可以不指定类型,生成空指针 sharedptr(const sharedptr& other): ptr(other.ptr), ctrl(other.ctrl){ if(ctrl) ctrl->shared_count++; //只要有控制块,就应该增加计数 } ~sharedptr(){ if(ctrl) ctrl->shared_count--; if(ctrl->shared_count == 0) { delete ptr; if(ctrl->weak_count == 0) delete ctrl; } } T& operator*() {return *ptr;} T* operator->() {return ptr;} int count() const{ //获取指针计数 return ctrl ? ctrl->shared_count : 0;
  } friend class Weakptr<T>; //weakptr需要使用sharedptr的成员,所以声明友元 };

 weakptr需要用到对应的控制块和shared_count:

class weakptr{
    T* ptr = nullpr;
    controlblock *ctrl = nullptr;

public:
    weakptr() = default;   //默认构造  weakptr默认构造的时候不指定内容

    weakptr( const sharedptr<T>& shared) : ptr(shared.ptr) ctrl(shared.ctrl){
        if(ctrl)   weak_count++;
    }  //从sharedptr上构造

    ~weakptr()
    {
         if(ctrl){
            ctrl->weak_count--;
            if(ctrl->shared_count==0 && ctrl->weak_coun==0)  delete ctrl;
            }
    }
        // 检查指针是否有效
    bool expired() const {
        return !ctrl || ctrl->shared_count == 0;
    }

    //通过lock() 获取对应的shared_ptr
    sharedptr<T> lock() const{
        if(expired()) return sharedptr<T>;

        sharedptr<T> shared;   //如果已经没有对应shared_ptr就要重新恢复一个出来
        shared.ptr = ptr;
        shared.ctrl = ctrl;
        ctrl->shared_count++;
        return shared;
    }
}

 



使用标准的智能指针时需要使用std::shared_ptr<int> ptr这样的格式。

标签:count,return,ctrl,c++,智能,shared,unique,ptr,指针
From: https://www.cnblogs.com/namezhyp/p/18686266

相关文章

  • NoETL更实时灵活 | 智能数据检索、动态数据缓存与成本最优执行计划联合保障无数据移动
    在数据管理领域,传统上我们习惯于通过数据复制、转换和整合到单一物理数据库的方式来满足所有信息需求。然而,这种方式常常以牺牲灵活性和数据交付速度为代价,换取查询性能的提升。面对海量数据,是否只能通过一再复制来实现理想的性能表现?答案是否定的。今天的技术进步让我们可以......
  • SSM建材生产智能化系统-毕业设计源码24838
    目 录1绪论1.1研究背景与意义1.2国内外研究现状1.3论文结构与章节安排2 建材生产智能化系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 ......
  • AI智能获客工具的意义是什么
    在当今竞争激烈的市场环境中,企业需要高效、精准的获客策略来维持增长和竞争力。AI智能获客工具的出现,为企业提供了一种全新的解决方案,通过自动化和智能化手段提高获客效率和质量。一、AI智能获客工具的核心价值1.1提高获客效率AI智能获客工具通过自动化流程,如自动筛选潜在......
  • GESP2024年6月认证C++六级( 第三部分编程题(1)计算得分)
    参考程序:#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[30];strings;intdp[N];intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) { cin>>a[i]; } intm; cin>>m; cin>>s; for(inti=1;i<=......
  • 计算机毕设项目源代码 小区物业智能管理系统
    标题:小区物业智能管理系统设计一个小区物业智能管理系统,可以提升物业管理的效率,优化居民的居住体验。以下是系统的关键功能模块及其详细说明:1.用户管理模块用户注册与登录:居民、物业管理人员和管理员可以通过手机号码或邮箱注册并登录系统。角色权限管理:根据用户角色(居民......
  • 最新毕设-Django-新能源汽车推荐系统-30063(免费领项目)可做计算机毕业设计JAVA、PHP、
    摘要本论文主要论述了如何基于Django框架开发一个新能源汽车推荐系统,本系统将严格按照软件开发流程进行各个阶段的工作,爬取懂车帝的汽车信息,面向对象编程思想进行项目开发。在引言中,作者将论述新能源汽车推荐系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,......
  • 【开源免费】基于Vue和SpringBoot的智能无人仓库管理系统(附论文)
    本文项目编号T157,文末自助获取源码\color{red}{T157,文末自助获取源码}......
  • 读量子霸权12人工智能
    1. 人工智能1.1. 马文·明斯基1.1.1. 麻省理工学院教授1.1.2. “人工智能之父”1.2. 人工智能领域似乎每年都有新的突破1.2.1. 数字计算机第一次可以下棋,甚至在简单的游戏中击败人类1.3. 物理学家正在探索单一“统一场论”​,以提供一个连贯、优雅的宇宙图景......
  • 人工智能学习(一)之python入门
    一、引言在当今的软件开发领域,面向对象编程(Object-OrientedProgramming,OOP)已经成为一种主流的编程范式。Python作为一门功能强大且简洁易读的编程语言,对面向对象编程提供了非常完善的支持。无论是开发大型项目、构建数据科学应用,还是进行自动化脚本编写,理解和掌握Python......
  • 给工作流穿上漂亮的衣服,创建用户交互界面并调用工作流,可定制的工作流,奶奶都能看明白的
    创建工作流看这个搭建小红书梗图、歪理生成器工作流搭建效果欢迎来到滔滔讲AI。本教程为免费系列教程,感谢关注,以防找不到。一、新建应用方式一,点击左侧导航的加号方式二、在工作空间面板选择右上角的创建按钮选择创建应用二、布局应用页面因为我选择的是PC版本的,......