C++语言基础篇

news2024/11/25 16:50:27

✅作者简介:CSDN内容合伙人,全栈领域新星创作者,阿里云专家博主,华为云云享专家博主,掘金后端评审团成员                         

💕前言:

学长出的这一系列专栏适合有⼀点 C++ 基础,但是⼜不怎么扎实,或者知识点串不起来的同学,说⽩了,这个专栏就是为了拯救 ⾯试突击的你,适合⾯试突击 C++ 后台岗位知识时拿来看,不敢说 100 % 涵盖了⾯试问题,但是⾄少 90%是有的。

                             再次渡入繁世,人潮汹涌,眼里茫然,信仰永恒,皆为华夏   

目录

C++ 语⾔基础篇

说⼀下你理解的 C++ 中的四种智能指针

1、auto_ptr(C++98 的⽅案,C11 已抛弃)采⽤所有权模式。

2、unique_ptr(替换 auto_ptr )

3、shared_ptr(共享型,强引⽤)

4、weak_ptr(弱引⽤)

C++ 语⾔基础篇

说⼀下你理解的 C++ 中的四种智能指针

⾯试官你好,⾸先,说⼀下为什么要使⽤智能指针:智能指针其作⽤是管理⼀个指针,避免咋们程序员申请的空间 在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。 然后使⽤智能指针可以很⼤程度上的避免这个问题,因为智能指针就是⼀个类,当超出了类的作⽤域是,类会⾃动 调⽤析构函数,析构函数会⾃动释放资源。所以智能指针的作⽤原理就是在函数结束时⾃动释放内存空间,不需要 ⼿动释放内存空间。

常⽤接⼝

T* get();

T& operator*();

T* operator->();

T& operator=(const T& val);

T* release();

void reset (T* ptr = nullptr);

T是模板参数, 也就是传⼊的类型;

get() ⽤来获取 auto_ptr 封装在内部的指针, 也就是获取原⽣指针;

operator() ᯿载 , operator->() ᯿载了->, operator=()᯿载了=;

realease() 将 auto_ptr 封装在内部的指针置为 nullptr, 但并不会破坏指针所指向的内容, 函数返回的是内部指 针置空之前的值; 直接释放封装的内部指针所指向的内存, 如果指定了 ptr 的值, 则将内部指针初始化为该值 (否则将其设置为

nullptr; 下⾯分别说⼀下哪四种:

1、auto_ptr(C++98 的⽅案,C11 已抛弃)采⽤所有权模式。

auto_ptr<std::string> p1 (new string ("hello"));

auto_ptr<std::string> p2;

p2 = p1; //auto_ptr 不会报错.

2、unique_ptr(替换 auto_ptr )

unique_ptr 实现独占式拥有或严格拥有概念,保证同⼀时间内只有⼀个智能指针可以指向该对象。它对于避免资 源泄露特别有⽤。 采⽤所有权模式,还是上⾯那个例⼦

unique_ptr<string> p3 (new string (auto));//#4

unique_ptr<string> p4;//#5

p4 = p3;//此时会报错

编译译器认为 p4=p3 ⾮法,避免了 p3 不再指向有效数据的问题。 因此,unique_ptr ⽐ auto_ptr 更安全。

3、shared_ptr(共享型,强引⽤)

shared_ptr 实现共享式拥有概念,多个智能指针可以指向相同对象,该对象和其相关资源会在“最后⼀个引⽤被销 毁”时候释放。从名字 share 就可以看出了资源可以被多个指针共享,它使⽤计数机制来表明资源被⼏个指针共 享。 可以通过成员函数 use_count() 来查看资源的所有者个数,除了可以通过 new 来构造,还可以通过传⼊auto_ptr, unique_ptr,weak_ptr 来构造。当我们调⽤ release() 时,当前指针会释放资源所有权,计数减⼀。当计数等于 0

时,资源会被释放。

shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性 (auto_ptr 是独占的),在使⽤引⽤计数的机制上提供了 可以共享所有权的智能指针。

4、weak_ptr(弱引⽤)

weak_ptr 是⼀种不控制对象⽣命周期的智能指针,它指向⼀个 shared_ptr 管理的对象。进⾏该对象的内存管理 的是那个强引⽤的 shared_ptr。

weak_ptr 只是提供了对管理对象的⼀个访问⼿段。weak_ptr 设计的⽬的是为配合 shared_ptr ⽽引⼊的⼀种智 能指针来协助 shared_ptr ⼯作,它只可以从⼀个 shared_ptr 或另⼀个 weak_ptr 对象构造,,它的构造和析构不会 引起引⽤记数的增加或减少。

weak_ptr 是⽤来解决 shared_ptr 相互引⽤时的死锁问题,如果说两个 shared_ptr 相互引⽤,那么这两个指针的 引⽤计数永远不可能下降为0,也就是资源永远不会释放。它是对对象的⼀种弱引⽤,不会增加对象的引⽤计数, 和 shared_ptr 之间可以相互转化,shared_ptr 可以直接赋值给它,它可以通过调⽤ lock 函数来获得

shared_ptr。 当两个智能指针都是 shared_ptr 类型的时候,析构时两个资源引⽤计数会减⼀,但是两者引⽤计数还是为 1,导 致跳出函数时资源没有被释放(的析构函数没有被调⽤),解决办法:把其中⼀个改为weak_ptr就可以。

关注博主不迷路,✌️公💕众👌号👀叶秋学长,即可领取学习路线和资源代码,拍一拍学长即可得到学长✌️

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PPT的“限制编辑”模式如何设置?

我们知道&#xff0c;Word文档和Excel表格都可以设置限制编辑&#xff0c;防止文件被随意改动&#xff0c;可是PPT文件里并没有“限制编辑”的选项&#xff0c;那要怎么设置呢&#xff1f; 其实&#xff0c;PPT的“只读模式”就等同于“限制编辑”模式&#xff0c;因为PPT文件…

【网页设计】期末大作业:化妆品主题——绿色大气的html5响应式化妆品护肤品肌肤网页设计(11页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Python解决图文验证码登录识别(1)

前言 本文是该专栏的第22篇,后面会持续分享python的干货知识,记得关注。 在信息爆炸的年代,爬虫对于在工作中进行信息的抽取,获取重要的数据源是一项非常不错的技能,可以说很久之前的爬虫几乎没什么难度,直到互联网的持续发展,陆陆续续出现了一大堆的反爬措施,给爬虫也…

【css 动画】css实现奔跑的北极熊

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;…

Verilog功能模块——Uart收发

摘要本文分享了一种通用的Uart收发模块&#xff0c;可实现Uart协议所支持的任意波特率&#xff0c;任意位宽数据&#xff08;5~8&#xff09;&#xff0c;任意校验位&#xff08;无校验、奇校验、偶校验、1校验、0校验&#xff09;&#xff0c;任意停止位&#xff08;1、1.5、2…

《机器学习实战》7.AdaBoost元算法提高分类性能

目录 1 基于数据集多重抽样的分类器 1.1 bagging&#xff1a;基于数据随机重抽样的分类器构建方法 1.2 boosting 2 训练算法&#xff1a;基于错误提升分类器的性能 3 基于单层决策树后见弱分类器 4 完整AdaBoost算法的实现 5 测试算法&#xff1a;基于AdaBoost的分类 6…

数据结构 - 二叉搜索树

目录 一、概念 二、实现 非递归删除 递归删除 三、总结 一、概念 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09; 也称二叉排序树&#xff0c;二叉查找树 二叉搜索树&#xff1a;一棵二叉树&#xff0c;可以为空&#xff0c;如果不为空&#xf…

内网工具viper的介绍与配置简介

文章目录0x01 介绍0x02 安装步骤一、首次安装二、更新版本三、修改密码四、反溯源配置五、关闭/重启六、安装目录介绍摘抄0x01 介绍 Viper(炫彩蛇)是提供图形化的操作界面,用户使用浏览器即可进行内网渗透. 0x02 安装步骤 一、首次安装 安装docker apt upodate apt instal…

Qt编写ffmpeg本地摄像头显示(16路本地摄像头占用3.2%CPU)

一、前言 内核ffmpeg除了支持本地文件、网络文件、各种视频流播放以外&#xff0c;还支持打开本地摄像头&#xff0c;和正常的解析流程一致&#xff0c;唯一的区别就是在avformat_open_input第三个参数传入个AVInputFormat参数&#xff0c;这个参数用于指定输入设备的格式&…

疯了!全网居然有人一次性把Java虚拟机HotSpot 给讲透彻了

Java虚拟机HotSpot HotSpot VM&#xff0c;相信大家多多少少都有所了解&#xff0c;它是目前使用范围最广的Java虚拟机&#xff0c;有着最终状态语言解释器的模板解释器。以及一直在不断迭代更新的垃圾回收器&#xff0c;还有极其超凡且精湛的即时编译器。 我认为&#xff0c…

迈动互联IBMS产品一项技术获国家专利

近日&#xff0c;迈动互联获得国家知识产权局颁发的专利证书。该专利为迈动IBMS产品应用领域的视频监控装置。近年来&#xff0c;迈动互联在IBMS可视运维平台产品持续加大研发投入&#xff0c;在IBMS领域新增9项专利&#xff0c;其中发明专利7项、实用新型2项。 迈动IBMS产品是…

centos7安装python3.7

1.安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 如果找不到wget命令&#xff0c;输入yum -y install wget安装其依赖将会被安装 2.下载python安装包…

李珣同款爱心特效代码,加DIY教程,快拿去送给你喜欢的那个ta吧。

&#x1f468;‍&#x1f393; 作者&#xff1a;bug菌 &#x1f389;简介&#xff1a;在CSDN、掘金等社区优质创作者&#xff0c;全网合计6w粉&#xff0c;对一切技术都感兴趣&#xff0c;重心偏java方向&#xff0c;目前运营公众号[猿圈奇妙屋]&#xff0c;欢迎小伙伴们的加入…

【Linux修炼手册:基本指令(上)】

目录 1 ls 指令 2 pwd命令 3 cd 指令 4 touch指令 5 mkdir指令&#xff08;重要&#xff09; 6 rmdir指令 && rm 指令&#xff08;重要&#xff09; 7 cp指令&#xff08;重要&#xff09; 8 mv指令&#xff08;重要&#xff09; 9 cat 总结&#xff1a; 1 ls…

k8s部署Skywalking及java接入agent

Skywalking由国内开源 大体架构是这样子 我用的是dockerhub的镜像 docker pull apache/skywalking-ui:8.5.0 docker pull apache/skywalking-oap-server:8.5.0-es7 docker pull elasticsearch:7.9.01.部署 搞了一个简单的es用 apiVersion: apps/v1 kind: Deployment metadat…

MySQL数据库基础:数据类型详解-文本字符串类型

前言 正好趁着这次一起学习复习一下MySQL数据库的基本知识。也是一直在用这个数据库&#xff0c;有些基础的知识点长久不用就会遗忘&#xff0c;就比如数据类型溢出的问题&#xff0c;很多时候建表的时候随便给定个类似&#xff0c;结果导入数据的时候报错又得删表就很麻烦&am…

第六章 Docker 应用部署

6-1 部署一个 SpringBoot 项目 1、将开发的 springboot 程序打成 jar 包或者 war 包&#xff1b; 2、将打好的 jar 包或 war 包上传到 Linux 某个目录下&#xff0c;比如:/root/docker 3、定义 Dockerfile 文件&#xff0c;用于创建项目镜像&#xff1b; 6-2 Docker 部署 Jar …

零基础如何学好Photoshop

1、首先第一点很重要&#xff0c;你要对PS感兴趣&#xff01; 学习好PS并不是一朝一夕就可以学好的&#xff0c;兴趣——是迈向PS大神之路的一个好的开头&#xff0c;如果你只是因为工作需要&#xff0c;被迫去学习PS&#xff0c;那么你无论请教哪位大师、报读任何培训班&…

linux篇【9】:进程间通信(共享内存)——<后序>

目录 一.system V共享内存——先让不同的进程看到同一份资源 1.共享内存原理 监控共享内存脚本 2.创建/获取 共享内存接口—shmget函数&#xff08;shared memory get&#xff09; 3.参数key解释 &#xff08;1&#xff09;共享内存存在哪里&#xff1f; &#xff08;2&a…

Spring Boot DTO 验证示例

在本教程中&#xff0c;我们将学习如何使用 Hibernate 验证器验证 Spring 启动 REST API DTO 请求。 在Java中&#xff0c;Java Bean Validation框架已经成为处理Java项目中验证的事实标准。 JSR 380 是用于 Bean 验证的 Java API 规范&#xff0c;它使用 NotNull、Min 和 Ma…