智能指针的创建

news/2024/10/8 17:24:12/文章来源:https://www.cnblogs.com/niumachen/p/18452110

智能指针是 C++ 中用于自动管理动态分配内存的工具,主要有三种类型:std::unique_ptrstd::shared_ptrstd::weak_ptr。下面是如何创建和使用这些智能指针的详细说明:

1. std::unique_ptr

  • 用途std::unique_ptr 是一种独占式智能指针,确保指向的对象在同一时间只能被一个指针拥有。它在作用域结束时自动释放其管理的对象。

  • 创建

    #include <memory>std::unique_ptr<int> ptr1 = std::make_unique<int>(10); // 创建并初始化
    
  • 使用

    if (ptr1) {std::cout << *ptr1 << std::endl; // 输出 10
    }
    
  • 注意std::unique_ptr 不支持复制,但支持移动:

    std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr1 现在为空,ptr2 拥有对象
    

2. std::shared_ptr

  • 用途std::shared_ptr 允许多个指针共同拥有同一个对象,通过引用计数来管理对象的生命周期。只要有 shared_ptr 指向对象,它就不会被释放。

  • 创建

    #include <memory>std::shared_ptr<int> ptr3 = std::make_shared<int>(20); // 创建并初始化
    
  • 使用

    std::cout << *ptr3 << std::endl; // 输出 20
    
  • 引用计数:当 shared_ptr 被复制时,会增加引用计数,当最后一个 shared_ptr 被销毁或重置时,管理的对象才会被释放。

3. std::weak_ptr

  • 用途std::weak_ptr 用于解决 shared_ptr 的循环引用问题。它不会增加引用计数,只是对 shared_ptr 的弱引用。当需要访问对象时,可以将 weak_ptr 升级为 shared_ptr

  • 创建

    #include <memory>std::weak_ptr<int> weakPtr = ptr3; // 指向一个 shared_ptr,但不增加引用计数
    
  • 使用

    if (auto sharedPtr = weakPtr.lock()) { // 尝试升级为 shared_ptrstd::cout << *sharedPtr << std::endl; // 如果成功,输出 20
    } else {std::cout << "Object has been deleted." << std::endl;
    }
    

总结

  • std::unique_ptr 用于独占管理,确保内存的唯一所有权。
  • std::shared_ptr 用于共享所有权,适合多个地方需要访问同一个对象的场景。
  • std::weak_ptr 用于避免循环引用的情况,提供对 shared_ptr 的非拥有性访问。

使用智能指针可以大大减少内存泄漏和错误管理内存的风险,是现代 C++ 编程的重要部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/810047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP 模拟9

CSP 模拟9 我也不明白学校模拟赛什么命名逻辑,凑合着看吧最唐的一集 邻面合并 这个直接状压就做完了,赛时早早想到做法,但是因为自己太唐把 \(0\) 写成 \(1\),在优秀大样例的助攻下挂掉 \(50\)点击查看代码 #include<bits/stdc++.h> using namespace std; using llt=…

南沙C++信奥赛陈老师解一本通题 1297:公共子序列

​【题目描述】我们称序列Z=<z1,z2,...,zk>Z=<z1,z2,...,zk>是序列X=<x1,x2,...,xm>X=<x1,x2,...,xm>的子序列当且仅当存在严格上升的序列<i1,i2,...,ik><i1,i2,...,ik>,使得对j=1,2,...,k,有xij=zjxij=zj。比如Z=<a,b,f,c> 是X=&l…

语音生成公司 ElevenLabs 估值达 30 亿美元;OpenAI Realtime API 很好也很贵丨RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编…

万兆加速计算卡设计资料保存:372-基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台

一、板卡概述 基于V7的高性能PCIe信号处理板,板卡选用Xilinx 公司Virtex7系列FPGA XC7VX690T-2FFG1761C为处理芯片,板卡提供两个标准FMC插槽,适用于高性能采集、回放以及相关处理。通过连接不同的FMC子卡的方式,可实现不同形式的数据采集、回放、处理的功能模块。板卡…

打造一站式应用内支付体验,助力开发者商业增长

随着移动互联网的发展,应用内支付已成为数字经济的重要组成部分。用户越来越追求便捷的支付体验,应用内支付服务提供的购买和订阅等能力满足了用户快速、无缝的支付需求,方便用户一站式完成交易,帮助开发者实现收入多元化。 HarmonyOS SDK应用内支付服务(IAP Kit)为用户精…

使用GRUB Multiboot2引导自制操作系统

使用GRUB Multiboot2引导自制操作系统 前言 之前花了一周时间,从头学习了传统 BIOS 的启动流程。惊讶于背后丰富的技术细节的同时,也感叹 x86 架构那厚重的历史包袱。毕竟,谁能想到,一个现代 CPU 竟然需要通过操作“键盘控制器寄存器”来启用一条地址线呢。 最终,出于兼容…

中电金信:源启数据建模平台:建模效率和管理精细度进一步提升

​源启数据建模平台是源启数据资产平台面向数据仓库等大型数据模型构建专门打造的模型设计工具。它以需求牵引模型动态演进,持续变更模型适应业务变化,并以Web和图形化方式,提供正向、逆向建模能力,高效复用模型资产和构建大型数据模型。同时,秉承“建模即治理”的思想,在…

是用python脚本清理reids连接

背景:测试环境的redis不知道咋回事突然无法连接,服务器登录查了一下发现连接数用完了。研发说雨女无瓜,测试环境删了没事,正事要紧赶紧恢复。得嘞!> info clients # Clients connected_clients:9997 # 连接中的数量 client_recent_max_input_buffer:54366 client_rece…

在Cucumber中应用 PicoContainer容器实现组件的实例化

通过 PicoContainer 这个轻量级的DI(Dependency Injection)组件容器进行组件的实例化, 相关介绍参考:http://picocontainer.com/introduction.html step1:定义一个ScenarioContext类 step2:添加jar依赖 implementation io.cucumber:cucumber-picocontainer:7.2.3 step3:…

查看交叉编译器的默认选项

1. 新建C文件mfloat.c#include <stdio.h> int main(void) { double a,b,c;a = 23.5436;b = 323.2348;c = b/a;printf("the result = %f\n", c);printf("hello world !\n");return 0; }2. 是 -v 选项 3. 显示结果如下

Starrocks模型表(一)

主键表优势:支撑实时数据更新的同时,也能保证高效的复杂即席查询性能 主键表中的主键具有唯一非空约束,用于唯一标识数据行,如果新数据的主键值与表中原数据的主键值相同,则存在唯一约束冲突,此时新数据会替代原数据应用场景实时对接事务型数据至StarRocks。事务型数据库…

2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为 k 特殊字符串。 其中,k 特殊字符串满足字符串中任意两个字符的出现频率

2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为 k 特殊字符串。 其中,k 特殊字符串满足字符串中任意两个字符的出现频率之差的绝对值均不超过 k。 你可以编写一个算法来计算最少需要删除多少个字符,使得给定的…