首页 > 其他分享 >智能指针中的share_ptr(共享智能指针)

智能指针中的share_ptr(共享智能指针)

时间:2024-12-09 22:29:35浏览次数:6  
标签:初始化 cout share 智能 Shared shared ptr 指针

初始化

共享智能指针是指多个智能指针可以同时管理同一块有效的内存,共享智能指针 share_ptr 是一个模板类,如果进行初始化有三种方式如下:
  1. 通过构造函数初始化
  2. std::make shared 辅助函数
  3. reset方法
共享智能指针对象初始化完毕之后就指向了要管理的那块堆区内存,如果想要查看当前有多少个智能指针同时管理着这块内存可以使用共享智能指针提供的一个成员函数use_count。
构造函数初始化
//使用智能指针管理一块 int 型的堆内存
shared_ptr<int> ptrl(new int(520));
cout<<"ptr1管理的内存引用计数:"<<ptr1.use_count()<< endl;
//使用智能指针管理一块字符数组对应的堆内存
shared_ptr<char> ptr2(new char[520]);
cout<<"ptr2 管理的内存引用计数:"<<ptr2.use_count()<<endl;
shared_ptr<int> ptr3;
cout<<"ptr3 管理的内存引用计数:"<<ptr3.use count()<<endl;
// 创建智能指针对象,初始化为空
shared_ptr<int> ptr4(nullptr);
cout<<"ptr4管理的内存引用计数:"<<ptr4.use count()<< endl;
/*打印结果如下:
ptr1 管理的内存引用计数:1
ptr2 管理的内存引用计数:1
ptr3 管理的内存引用计数:0
ptr4 管理的内存引用计数:0*/
/*如果智能指针被初始化了一块有效内存,那么这块内存的引用计数+1,
如果智能指针没有被初始化或者被初始化为 nullptr 空指针,引用计数为 0。
另外,不要使用一个原始指针初始化多个shared_ptr。*/
#include <iostream>
#include <memory>
using namespace std;
int main() {
    int* raw_ptr = new int(10);
    shared_ptr<int> sp1(raw_ptr);
    shared_ptr<int> sp2(raw_ptr);
    // 在这里,sp1和sp2各自维护自己的引用计数,它们不知道彼此的存在
    // 当sp1的引用计数归零时,它会释放raw_ptr指向的内存
    // 但是此时sp2还在使用这个内存,这就会导致错误,二次释放问题
    return 0;
}
拷贝和移动构造函数初始化

当一个智能指针被初始化之后,就可以通过这个智能指针初始化其他新对象。在创建新对象的时候,对应的拷贝构造函数或者移动构造函数就被调用了

//构造函数
shared_ptr<int> ptrl(new int(520));
cout<<"ptr1 管理的内存引用计数:"<<ptrl.use count()<< endl;

//拷贝构造函数
shared_ptr<int> ptr2(ptrl);
cout<<"ptr2 管理的内存引用计数:"<<ptr2.use count()<< endl;
shared_ptr<int>ptr3=ptrl;
cout <<"ptr3 管理的内存引用计数:"<<ptr3.use count()<<endl;

//移动构造函数
//移动构造会把ptr1的资源移动到ptr4,ptr1会变成一个空指针,不在管理原来的资源,所以引用计数不增加
shared_ptr<int>ptr4(std::move(ptrl));
cout<<"ptr4管理的内存引用计数:"<<ptr4.use count()<< endl;
std::shared_ptr<int>ptr5=std::move(ptr2);
cout<<"ptr5 管理的内存引用计数:"<< ptr5.use count()<<endl;

/*打印结果如下:
ptr1管理的内存引用计数:1
ptr2管理的内存引用计数:2
ptr3管理的内存引用计数:3
ptr4管理的内存引用计数:3
ptr5管理的内存引用计数:3*/
std::make shared 初始化

通过 c++11 提供的 std::make shared()就可以完成内存对象的创建并将其初始化给智能指针

#include <iostream>
#include <string>
#include <memory>
using namespace std;
class Test{
public:
    Test(){
        cout<< "无参构造函数"<< endl;
    }
    Test(int x){
        cout<<"int 类型构造函数"<< x<< endl;
    }
    Test(string str){
        cout <<"string 类型的构造函数"<<str<< endl;
    }
    ~Test(){
        cout<<"析构函数"<< endl;
    }
};
int main(){
// 使用智能指针管理一块 int 型的堆内存,内部引用计数为 1
    shared_ptr<int>ptrl=make shared<int>(520);
    cout<<"ptr1管理的内存引用计数:"<<ptr1.use_count()<< endl;
    shared_ptr<Test>ptr2=make shared<Test>();
    cout<<"ptr2 管理的内存引用计数:"<<ptr2.use_count()<< endl;
    shared_ptr<Test>ptr3 =make shared<Test>(520);
    cout<<"ptr3 管理的内存引用计数:"<<ptr3.use_count()<< endl;
    shared_ptr<Test>ptr4 = make shared<Test>("QQQQ");
    cout<<"ptr4管理的内存引用计数:"<<ptr4.use_count()<< endl;
    shared_ptr<Test>ptr5(new Test(200));
    cout<<"ptr5 的引用计数为:"<<ptr5.use_count()<< endl;
    return 0;
}

/*打印结果如下:
    ptr1管理的内存引用计数:1
    无参构造函数
    ptr2管理的内存引用计数:1
    int类型构造函数 520
    ptr3管理的内存引用计数:1
    string类型的构造函数 QQ22
    ptr4管理的内存引用计数:1
    int类型构造函数
    ptr5管理的内存引用计数:1
    析构函数
    析构函数
    析构函数
    析构函数*/

如果使用拷贝的方式初始化共享智能指针,这两个对象会同时管理同一块内存,堆内存对应的引用技术也会增加。如果使用移动构造的方式初始化智能指针对象,只是转让了内存的所有权,管理内存的对象不会增加,因此内存引用技术不会增加。

reset方法初始化
#include <iostream>
#include <string>
#include <memory)
using namespace std;
int main(){
// 使用智能指针管理一块 int 型的堆内存,内部引用计数为 1
    shared_ptr<int>ptrl=make shared<int>(520);
    shared_ptr<int>ptr2=ptrl;
    shared_ptr<int> ptr3=ptrl;
    shared_ptr<int>ptr4=ptrl;
    cout<<"ptr1 管理的内存引用计数:"<< ptrl.use count()<< endl;
    cout<<"ptr2 管理的内存引用计数:"<<ptr2.use count()<< endl;
    cout<<"ptr3 管理的内存引用计数:"<<ptr3.use count()<< endl;
    cout<<"ptr4管理的内存引用计数:"<<ptr4.use count()<< endl;
    ptr4.reset();
    cout<<"ptr1 管理的内存引用计数:"<< ptrl.use count()<< endl;
    cout<<"ptr2 管理的内存引用计数:"<<ptr2.use count()<< endl;
    cout<<"ptr3 管理的内存引用计数:"<<ptr3.use count()<< endl;
    cout<<"ptr4管理的内存引用计数:"<<ptr4.use count()<< endl;
    shared ptr<int> ptr5;
    ptr5.reset(new int(250));
    cout<<"ptr5 管理的内存引用计数:"<<ptr5.use count()<< endl;
    return 0;
}

/*打印结果如下
    ptr1管理的内存引用计数:4
    ptr2 管理的内存引用计数:4
    ptr3 管理的内存引用计数:4
    ptr4 管理的内存引用计数:4
    ptr1 管理的内存引用计数:3
    ptr2 管理的内存引用计数:3
    ptr3 管理的内存引用计数:3
    ptr4 管理的内存引用计数:0
    ptr5 管理的内存引用计数:1*/

对于一个未初始化的共享智能指针,可以通过 reset 方法来初始化,当智能指针中有值得时候,调用reset 会使引用计数减 1.

获取原始指针

get()函数

nt main(){
    shared_ptr<int> p(new int);
    *p = 100;
    cout << *p.get()<<" "<< *p<< endl;
    return 0

}
//100 100
share_ptr实现
#pragma once
#include<iostream>
using namespace std;

template<typename T>
class Ref
{
T* p;
    int n;
public:
    Ref() {
p = nullptr;
n = 0;
    }
    Ref(T* p) {
this->p = p;
n = 1;
    }
    void increase() {
if(p) n++;
    }
    void reduce() {
if(n>0) n--;
if (n == 0) {
delete p;
delete this;
}
    }
    int useCount() {
return n;
    }
T* get() {
return p;
}
};

template<typename T>
class Shared_ptr
{
Ref<T>* r;
public:
    Shared_ptr() {
r = new Ref<T>();
    }
    Shared_ptr(T* p) {
r = new Ref<T>(p);
    }
    Shared_ptr(const Shared_ptr& o) {
this->r = o.r;
if(r->get()) r->increase();
    }
    Shared_ptr(Shared_ptr&& o) {
this->r = o.r;
o.r = nullptr;
    }
    ~Shared_ptr() {
if(r) r->reduce();
    }
Shared_ptr& operator=(const Shared_ptr& other) {
r->reduce();
this->r = other.r;
if(r->get()) this->r->increase();
return *this;
    }
Shared_ptr operator=(Shared_ptr&& other) {
r->reduce();
this->r = other.r;
other.r = nullptr;
return *this;
    }
    int use_Count() {
if (r) return r->useCount();
else return 0;
    }
T* get() {
return r->get();
    }
void reset() {
r->reduce();
r = nullptr;

    }
    void reset(T* p) {
r->reduce();
r = new Ref<T>(p);

    }
T& operator*() {
return *(r->get());
    }
T* operator->() {
return r->get();
    }
};

标签:初始化,cout,share,智能,Shared,shared,ptr,指针
From: https://blog.csdn.net/2401_88249494/article/details/144359321

相关文章

  • node.js毕设城市出行行程智能推荐系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于城市出行行程智能推荐系统的研究,现有研究主要以单一出行方式的优化或通用的路径规划为主,专门针对整合多种出行方式并依据用户个性化需求来智能推荐......
  • Python与人工智能37——字符串全排列与算法应用场景
    ......
  • Knowledge Graph Studio:让知识图谱构建更简单、更智能
    一、前言上周和研究院的同事讨论2025年大模型产品规划时,让我产生了一些疑惑和不解,因为从大家交流的规划方向来看,更多的还是集中在Prompt提示词工程(包括提示词的管理、测试、评估、调优)这一块规划的确实挺细,另外一个重点也提到了对于大模型微调、训练以及模型推理效率的提......
  • 一道C语言指针有关问题的讲解
    原题#include<stdio.h>intmain(){char*c[]={"ENTER","NEW","POINT","FIRST"};char**cp[]={c+3,c+2,c+1,c};char***cpp=cp;printf("%s\n",**++cpp);printf(&quo......
  • 初识C语言(指针、结构体)
    *前言学习C语言自用教材:C程序设计第五版--谭浩强线上课程:跟学博主:鹏哥C语言。视频:1.【初识C语言】认识C语言_哔哩哔哩_bilibili1.指针1.1内存内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。为了有效的使用内存,把内存划分成一个个小的内存单......
  • 城市基础设施数字化管理:打造安全、智能的城市生命线
    随着数字化转型的深入,城市基础设施生命线的安全管理正面临前所未有的机遇与挑战。城市基础设施,包括交通、能源、供水、排水、通信等,是城市运行的“生命线”,其安全治理直接关系到城市的稳定与人民生活的安全。数字化转型对城市生命线安全治理的影响数字化转型为城......
  • 平台发展的智能化革新之路
      ========  一、引言----  随着互联网的快速发展和人工智能技术的崛起,电商平台逐渐进入了一个新的发展阶段。在这个阶段,AI技术的应用成为了提升电商平台销售效率的关键因素。从用户体验到供应链管理,AI技术正在深刻影响着电商行业的未来发展趋势。本文将围绕AI技术在电......
  • 勤哲EXCEL服务器自动生成企业智能信息管理系统
    如今,企业管理正处于信息化、数字化转型的关键阶段,信息化、数字化技术的广泛应用正在改变着传统管理模式。从数据分析、人工智能到云计算等各种数字化工具的出现,为企业提供了更高效、更精确的管理手段。专家认为,信息化企业管理不仅能够提升生产效率、降低成本,还能够实现信息共享......
  • 【人工智能】Moss-AI编程利器:CodeMoss & ChatGPT中文版超详细入门教程!(VScode/IDER/WE
    文章目录摘要一、环境介绍VSvode安装步骤IDER(Pycharm)安装步骤Web使用步骤二、Moss9大功能讲解1、AI问答对话2、文件上传功能3、自定义AI助手4、AI联网助手5、AI图片识别6、思维链思维链的简单介绍使用CodeMoss思维链7、AI图片生成图片生成效果8、图片生成代码9、......
  • AI智能分析视频分析网关摄像机实时接入分析平台:海康/宇视安防摄像机中支持哪些音频格
    在安防监控系统中,音频编码和传输技术与视频同样重要,它们共同构成了一个完整的监控解决方案。海康和宇视作为安防领域的两大品牌,提供了多种音频编码格式以满足不同场景的需求。本文将详细介绍这些音频编码格式,探讨摄像机的音频输入输出类型,以及音频线的选择和使用。此外还将介绍一......