当前位置: 首页 > news >正文

C++的智能指针

很久之前,我们说到了new和delete关键字。

new在堆上分配内存,需要delete来删除内存、释放内存,因为它不会自动释放内存。

智能指针是实现过程自动化的一种方式,即当我们调用new时,我们不需要调用delete关键字。

在很多情况下我们甚至不需要调用new。

智能指针实际上是一个原始指针的包装,当我们创建一个智能指针,它会调用new并为我们分配内存,然后基于我们使用的智能指针,这些内存会在某一时刻自动释放。

我们首先来了解一下unique_ptr

unique_ptr是作用域指针,是超出作用域时他会被销毁,然后调用delete

我们不可以复制一个unique_ptr,因为如果复制一个unique_ptr,那么我们就有两个指针指向了同一块内存地址。如果其中一个die了,那么它就会释放这段内存,也就是说,指向同一块内存的第二个unique_ptr指向了被释放的内存,所以我们不可以复制unique_ptr。

注意:要访问智能指针,我们需要memory头文件

#include<iostream>
#include<string>
#include<memory>class Entity
{
public:Entity()  //构造函数{std::cout<<"Create Entity!"<<std::endl;}~Entity()  //析构函数{std::cout<<"Destory Entity!"<<std::endl;}void Print(){}
};int main()
{{// std::unique_ptr<Entity> entity(new Entity()); //entity=new Entity是不可以的,因为unique_ptr需要显式地调用//尖括号的Entity是unique_ptr的模版,entity是unique_ptr的名字std::unique_ptr<Entity> entity = std::make_unique<Entity>();//推荐,因为如果构造函数抛出异常,这种方式会稍微安全一些,因为我们不会得到一个没有引用的悬空指针从而造成内存泄露entity->Print();//我们可以调用想要的任何方法 }std::cin.get();
}

共享指针shared_ptr的工作方式是通过引用计数,引用计数基本上是一种方法,可以跟踪我们的指针有多少个引用,一旦引用计数达到0,它就被删除了

shared_ptr需要分配一块内存,叫做控制块,用来存储引用计数

弱指针weak_ptr

相关文章:

  • Java爬虫抓取数据的艺术
  • 电脑ip地址怎么换地区:操作步骤与利弊分析
  • 【学习笔记】TLS/SSL握手之Records
  • 智能新宠:BabyAlpha A2开启家庭机器人新时代
  • 【JAVA】synchronized 关键字的底层实现涉及得三个队列
  • Python知识点:如何使用Python进行物联网数据处理
  • JavaScript的条件语句
  • hive分区详细教程
  • 基于flask常见trick——unicode进制编码绕过
  • 【rabbitmq-server】安装使用介绍
  • Mac写入U盘文件如何跨平台使用 Mac电脑怎么把U盘文件传送到电脑 mac怎么用u盘拷贝文件
  • MMD模型一键完美导入UE5-VRM4U插件方案(一)
  • 国产sql工具何时才能出头?
  • 搜维尔科技:使用Xsens动作捕捉系统和ai训练人形机器人模仿人类运动,执行复杂任务
  • Redis:事务
  • Debian下无root权限使用Python访问Oracle
  • ECMAScript6(0):ES6简明参考手册
  • EOS是什么
  • es6要点
  • Object.assign方法不能实现深复制
  • oldjun 检测网站的经验
  • opencv python Meanshift 和 Camshift
  • React中的“虫洞”——Context
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • web标准化(下)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 高度不固定时垂直居中
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 我有几个粽子,和一个故事
  • 消息队列系列二(IOT中消息队列的应用)
  • 一些关于Rust在2019年的思考
  • 移动端解决方案学习记录
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #微信小程序(布局、渲染层基础知识)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (LLM) 很笨
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (南京观海微电子)——示波器使用介绍
  • (新)网络工程师考点串讲与真题详解
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Linq学习笔记
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .naturalWidth 和naturalHeight属性,
  • .NET CLR Hosting 简介
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net Core 中间件验签
  • .Net IE10 _doPostBack 未定义