5. 智能指针(等后续

2023-11-16

指针本质上是一个内存地址索引,代表了一块内存区域,能够直接读写内存;因为指针完全映射了计算机硬件,所以操作效率高,是C/C++高效的根源。但是指针也会产生访问无效数据、指针越界或者内存分配不及时等导致的运行错误,内存泄漏,资源丢失等一系列问题。
RAII (Resource Acquisition is Initialization )资源获取即初始化,将裸指针包装起来,在构造函数里初始化,在析构函数里释放,这样当对象失效销毁时,C++会自动调用析构函数,完成内存释放,资源回收等清理工作。--->智能指针 RAII的典型应用

unique_ptr

在声明的时候必须使用模板参数指定类型

unique_ptr<int> ptr1(new int(20));
unique_ptr<string> ptr2(new string("hello"));
assert(*ptr1 = 10);//可以用*取内容
assert(*ptr2 == "xixi");
assert(ptr2->size() == 5);

unique_ptr不是指针,而是一个对象,随意不能对它调用delete,它会自动管理初始化时的指针,在离开作用域时释放内存,也没有定义加减运算,随意不能随意移动指针地址ptr++(error),这样就完全 避免了指针越界等危险操作,可以让代码更安全。
使用智能指针必须先初始化,不能不初始化声明后直接使用;未初始化的unique_ptr表示空指针,操作空指针容易引起core dump

unique_ptr<int> ptr3;//未初始化的智能指针
*ptr3 = 1;//error 操作了空指针

在C++14中,可以调用工厂函数make_unipue(),强制创建智能指针的时候必须初始化,同时还可以利用自动类型推导

auto ptr3 = make_unique<int>(1);//工厂函数创建只能指针
auto ptr4 = make_unique<string>("xixi");

C++14以下,也可以自己实现一个简化版的make_unique()

template<class T, class...Args> 		//可便参数模板
std::unique<T> my_make_unique(Args&&... args)
{
	return std::unique_ptr<T>(new T(std::forward<Args>(args)...));//unique_ptr<int> ptr1(new int(20));
}

unique_ptr表示指针的所有权是“唯一的”,不允许共享,任何时候只能被一个所持有。因此unique_ptr应用了C++的转移move语义,同时禁止了拷贝赋值,所以在向另一个unique_ptr赋值的时候,用std::move()函数显示地声明所有权转移,转移成功后,原来的unique_ptr变成了空指针。

shared_ptr

shared_ptr<int> ptr1(new int(10));
shared_ptr(string> ptr2(new string("hello"));

//也可以用工厂函数创建只能指针
auto ptr3 = make_shared<int>(10);

make_shared可以被共享,即支持拷贝赋值,可以直接拷贝赋值auto ptr4 = ptr2;其内部使用了引用计数
当引用计数减少到1就会delete释放内存。但shared_ptr的引用计数的存储和管理都是成本。
shared_ptr引用计数导致的“循环引用”问题会导致引用计数无法减到0,无法调用析构函数执行delete,最终导致内存泄漏。从而引入:

weak_ptr

弱引用专为打破循环引用而设计,之观察指针,不会增加引用计数,但在需要的时候,可以调用成员函数lock(),获取shared_ptr强引用。。。当循环引用的时候weak_ptr的引用计数不会增加,因而不会导致内存泄漏。

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

5. 智能指针(等后续 的相关文章

随机推荐

  • Dialog DA14585——基本硬件资源配置

    GPIO DA14585共有3中类型的封装 WLCSP34pin QFN40pin QFN48pin 除去专用的RST GND XTAL ANT VBAT脚后 分别有14 25 32个IO口可用 目前最常用的封装类型是QFN40 处理单元
  • ssh key创建本地和git的安全连接 && ssh key的创建与github/gitlab中ssh key的添加

    如未创建ssh key会报该问题 The authenticity of host can t be established Permission denied publickey ssh key的作用 创建本地和gitlab的安全连接 S
  • 从特效入手,深入了解CSS(二):鼠标 hover 特效

    不建议跳跃阅读 这篇文章将从头开始介绍如何实现一个特效 中间偶尔会穿插一些css3或平时接触不多的css属性 首先看一看这一期的特效 HTML部分 h1 Hover Me h1 CSS 部分 首先通过grid布局的place content
  • 一文搞定java8中的重要特性

    文章目录 Lambda表达式 函数式接口 四大内置函数接口 接口的默认方法和静态方法 方法引用 重复注解 更好的类型推断 拓宽注解的应用场景 Optional Stream Date Time API Base64 并行数组 并发性 JVM
  • Windows SDK与Platform SDK的区别

    原文URL http forums microsoft com MSDN ShowPost aspx PostID 1986681 SiteID 1 概述 Windows SDK已经取代了Platform SDK Platform SDK已
  • 使用Yolov5+Pytorch训练自定义目标检测模型

    一 简介 使用Pytorch Yolov5和OpenCV 完成目标检测模型的训练和部署 项目的两个功能 1 Yolov5离线文件夹 主要是为了照顾国内的网络环境 文件夹不仅包含了https github com ultralytics yo
  • 物联网(java版本)臻识摄像头+本地实时显示视频

    部分代码显示 package com xdnnaovideo videoservice listenermessage import com google gson Gson import com xdnnaovideo videoserv
  • stm32毕设分享 stm32老人跌倒检测预防系统

    文章目录 0 前言 1 整体设计 2 硬件电路 3 软件设计 4 跌倒检测算法 5 关键代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹
  • 最新版的配音软件--- tts-vue 软件 下载安装成功过程

    目录 本次软件是 Loker 制作 感谢作者的无私奉献 软件视频效果 软件图片效果 1 电脑版的tts vue 软件下载链接以及说明 2 tts vue 网站在线转换链接 3 tts vue 软件 功能简介 截至最新版本 已实现的功能 安装
  • gitlab--基础--5.1--CICD--介绍

    gitlab 基础 5 1 CICD 介绍 1 什么是CICD 1 1 CI 持续集成 Continuous Integration 1 1 1 持续集成 将各个开发人员的工作集合到一个代码仓库中 主要目的是尽早发现集成错误 使团队更加紧密
  • 关于退出进程的几种方式

    创建于 2012 08 27 迁移自个人的百度空间 HUP 是让进程挂起 睡眠 kill 杀掉进程 term 正常的退出进程 kill HUP pid pid 是进程标识 如果想要更改配置而不需停止并重新启动服务 请使用该命令 在对配置文件
  • 深入理解MyBatis一级缓存和二级缓存【超详细源码解析】

    视频地址 https www bilibili com video BV1nP411A7Gu MyBatis的缓存是一个常见的面试题 一级缓存的作用域为何是 sqlSession 二级缓存的作用域为何是 mapper 怎么理解 一 二级缓存
  • Go实现单例模式

    非线程安全的单例模式 type Singleton struct var instance Singleton func GetInstance Singleton if instance nil instance Singleton re
  • 【待续】【UE4笔记】 L10地形编辑器

    一 地形界面 包含了管理 雕刻和描画功能 1 创建新项 2 雕刻 改变地形高度 顶点位置 3 描画 分层地形材质 二 编辑样条 调节参数 添加材质 效果如下
  • 极限多标签学习综述(Extreme Multi-label Learning)

    A Survey on Extreme Multi label Learning 先给地址 https arxiv org abs 2210 03968 博主曾整理过Multi Label Image Classification 多标签图
  • Docker下安装SVN

    1 搜索svn镜像 root VM 0 6 centos docker search svn 2 拉取svn server的docker镜像 root VM 0 6 centos docker pull docker io garethfl
  • Stable Diffusion Webui源码剖析

    1 关键python依赖 1 xformers 优化加速方案 它可以对模型进行适当的优化来加速图片生成并降低显存占用 缺点是输出图像不稳定 有可能比不开Xformers略差 2 GFPGAN 它是腾讯开源的人脸修复算法 利用预先训练号的面部
  • 分布式--redis基本数据结构及使用

    文章目录 redis常用5种数据结构 字符串常用操作 字符串使用场景 1 单值缓存 session共享等 2 对象缓存 3 简单的分布式锁 4 计数器 5 全局唯一序列号 hash结构常用操作 hash结构的使用场景 1 对象缓存 2 购物
  • SpringBoot+Vue如何写一个HelloWorld

    一 SpringBoot介绍 Spring Boot是一个用于创建独立且可执行的Spring应用程序的框架 它简化了基于Spring框架的应用程序的开发过程 并提供了一种快速和简便的方式来构建Java应用程序 Spring Boot提供了自
  • 5. 智能指针(等后续

    指针本质上是一个内存地址索引 代表了一块内存区域 能够直接读写内存 因为指针完全映射了计算机硬件 所以操作效率高 是C C 高效的根源 但是指针也会产生访问无效数据 指针越界或者内存分配不及时等导致的运行错误 内存泄漏 资源丢失等一系列问题