内存的智能管理—智能指针

2023-11-06

前言

我们在使用C和C++进行开发的时候,申请堆区内存是必不可少的,但是很多时候,我们经常忘记释放他导致内存泄漏,从而导致程序崩溃,又或者在尚未使用完成的时候释放,从而导致出现野指针,都是非常危险的现象,所以我们在C++11的标准中提出了智能指针的概念,他就是一种可以帮我们自动释放内存的存在

共享智能指针 - shared_ptr

他是使用最多的智能指针,它可以让多个指针指向同一片内存,同时在这片内存指向变为0的时候,他就会被释放
他有三种构造方式

//直接构造
shared_ptr<int>ptr(new int(10));
//使用make_shared
shared_ptr<int>ptr1=make_shared<int>(9);
//直接赋值
shared_ptr<int>ptr2=ptr1;

同样你还可以使用他的一些成员函数

get()//获取当前指针
swap()//交换管理对象
reset()//对指针进行重置操作,使原有指向修改为新的指向,该函数会
首先将原有内存减1,当减小为0会释放内存
use_conut()//智能指针指向内存引用计数

同样的,智能指针只能管理一片内存,要是管理数组需要手动释放

 //智能指针只能管理一块内存, 要是想管理数组, 需要手动释放   
  //智能指针管理数组, 需要自己指定lamb表达式自己释放   
 shared_ptr<A> ptr4(new A[5], [](A *p) {
         //释放内存        
         delete[]p;    
         });
 

唯一智能指针 - unique_ptr

只允许一个智能指针指向这块内存

//直接构造
unique_ptr<int>ptr(new int(10));
//使用make_shared,在linux环境下无法使用
unique_ptr<int>ptr1=make_shared<int>(9);

弱指针 -weak_ptr

这个使用的很少,主要是为了解决循环引用导致的内存泄露,引入了弱指针,他不会计入共享指针的数值,所以他不会对内存进行管理,主要是用来检测是否被释放

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存的智能管理—智能指针 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 取模!了解一下!

    嘤嘤嘤 快速幂取模都不会了 自闭了 取模运算 Modulo Operation 和取余运算 Complementation 两个概念有重叠的部分但又不完全一致 主要的区别在于对负整数进行除法运算时操作不同 取模主要是用于计算机术语中 取余则
  • 面向对象-继承

    继承 概念 继承父类的属性和行为 使得子类对象可以直接具有与父类相同的属性 相同的行为 子类可以直接访问父类中的非私有的属性和行为 继承是多态的前提 如果没有继承 就没有多态 特点 java只能单继承 但可以多层继承 a继承b b继承c 那
  • kafkatemplate无法注入_Spring Boot和Kafka实战自定义复杂配置示例

    这篇博客文章展示了如何配置Spring Kafka和Spring Boot以使用JSON发送消息并以多种格式接收它们 JSON 纯字符串或字节数组 基于此配置 您还可以将Kafka生成器从发送JSON切换到其他序列化方法 此示例应用程序还演
  • RabbitMQ--基础--10.4--优先级队列

    RabbitMQ 基础 10 4 优先级队列 1 优先级队列 指的是 具有高优先级的队列 优先级高的消息具备优先被消费的特权 可以通过 设置 x max priority 来设置 优先级队列 如果在消费者的消费速度远大于生产者的速度 且 B
  • 机票预订系统uml类图_产品经理必学UML(二):用例图

    上一篇中介绍了UML中的类图 本篇笔者将与大家介绍UML中的用例图的三个方面内容 用例 Use Case 参与者 Actor 参与者 用例之间的关系 用例图 Use Case Diagrame 描述了人们希望如何使用一个系统 将相关用户 用
  • java listnode 合并链表_java实现两个有序单链表合并

    本次分享的事两个有序单链表的合并 遍历方法递归 非递归 节点类 auther lawt date 2018 11 4 08 Description 结点信息 public class Node 为了方便 这两个变量都使用public 而不用
  • ESP8266如何使用u8g2(I2C)驱动SH1106的OLED

    u8g2是一款单色图形库 非常适合12864之类的显示屏 基本上支持了市面上的主流显示控制器 可是偏偏对SH1106不是那么友好 使用起来不是很方便 打开IDE的示例程序可以看到对SH1106列出来的几乎都SPI通信方式 仅仅只有一条是使用
  • Collection集合类和Map接口各实现类详解

    Java的集合类 collection接口和Map 一 集合概述 集合 集合是java中提供的一种容器 可以用来存储多个数据 集合和数组既然都是容器 它们有啥区别呢 数组的长度是固定的 集合的长度是可变的 数组中存储的是同一类型的元素 可以
  • RHEL 6.1 KVM虚拟机桥接物理机网络

    RHEL6 1 KVM虚拟机桥接物理机网络 一 KVM默认网络配置 1 kvm上网有两种配置 a NAT 支持主机与虚拟机的互访 也支持虚拟机访问互联网 但不支持外界访问虚拟机 b bridge 桥接 可以使用虚拟机成为网络中具有独立IP的
  • python进程简单操作

    1 用进程实现类似定时器的功能 import multiprocessing import time def clock interval while True print The time is 0 format time ctime t
  • java创建线程的四种方式

    1 继承Thread类创建线程 如图所示 继承Thread类 class Aclass extends Thread 输出100以内的偶数 Override public void run for int i 1 i lt 100 i Sy
  • DINO学习笔记

    DINO学习笔记 DINO DETR with Improved DeNoising Anchor Boxes for End to End Object Detection Abstract 我们提出了DINO DETR with Imp
  • ctfshow web11详解,小白补充session和PHPSESSID相关知识

    删除cookie中存储的PHPSESSID 删除PHPSESSID的值后 空密码即可登录了 这里有个误区 刚开始的我对session的知识点了解很少 我甚至觉得直接把PHPSESSID的值当作密码的值就满足 password SESSION
  • Qt入门-QLabel类

    QLabel是QT界面中的标签类 它从QFrame下继承 class Q GUI EXPORT QLabel public QFrame Q OBJECT 定义一个QLable类 QLabel label new QLabel this 设
  • PTA 乙级——1029 旧键盘 C++实现

    旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及实际被输入的文字 请你列出肯定坏掉的那些键 输入格式 输入在 2 行中分别给出应该输入的文字 以及实际被输入的文字 每段文字是不超过 80 个
  • OpenGL学习——(1)

    基础概念 刚接触OpenGL 感觉概念比较抽象 函数库也非常强大 学习起来比较吃力 本文为自己的学习笔记 主要将厚厚的课本知识进行整理 方便今后复习 同时也可以帮助其他初学者查看知识点 减少他们在学习过程中花费的时间 1 光栅化 实际绘制或
  • Unity VR 开发教程 OpenXR+XR Interaction Toolkit (五) UI

    文章目录 教程说明 制作 World Space 模式的 UI 添加 Tracked Device Graphic Raycaster 脚本 添加 XR UI Input Module 脚本 添加 UI 射线相关脚本 负责 UI 射线的物体
  • 实现radio单选框单击取消选中状态

    需求 项目中对于有些单选内容可以设置默认选中 也可以不设置默认选中 而一般使用radio后 选中其中一个后 就无法让全部的radio恢复到一开始的未选中状态 如下图 后面的单选框只能三选一 并且也可以全部不选 同时如果选中了其中一个后 也可
  • 边缘计算:发展与挑战

    作者 高聪1 2 3 1 西安邮电大学计算机学院 2 西安邮电大学陕西省网络数据分析与智能处理重点实验室 3 西安邮电大学西安市大数据与智能计算重点实验室 本文对边缘计算进行了系统性的介绍 来源 边缘计算社区 边缘计算社区经过作者授权发布本
  • 内存的智能管理—智能指针

    前言 我们在使用C和C 进行开发的时候 申请堆区内存是必不可少的 但是很多时候 我们经常忘记释放他导致内存泄漏 从而导致程序崩溃 又或者在尚未使用完成的时候释放 从而导致出现野指针 都是非常危险的现象 所以我们在C 11的标准中提出了智能指