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

面试问题--智能指针

什么是智能指针?

当你在编写程序时,可能需要在运行时动态分配内存来存储数据。在传统的C++中,你可能会使用 new 和 delete 操作符来手动管理内存。但是这样容易出现一些问题,比如忘记释放内存导致内存泄漏,或者释放了之后仍然使用已经释放的内存(悬空指针问题)。
智能指针是为了解决这些问题而引入的。它们是一种封装了动态分配内存的对象,具有自动内存管理的功能。C++标准库提供了两种主要的智能指针类型:std::shared_ptr 和 std::unique_ptr。

  • std::shared_ptr : 允许多个智能指针共享同一块内存,使用引用计数来跟踪共享情况。
  • std::unique_ptr 保证在任何时候只有一个智能指针可以管理特定的内存块,支持独占所有权。

1.std::shared_ptr:

  • std::shared_ptr 允许多个智能指针共享同一块内存。
  • 每个 shared_ptr 都有一个关联的引用计数,记录有多少个 shared_ptr 指向相同的内存。
  • 当引用计数变为零时,表示没有智能指针再指向这块内存,内存会被释放。
#include <memory>int main() {// 创建一个 shared_ptr,它指向一个动态分配的整数std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);// 创建另一个 shared_ptr,与前一个共享同一块内存std::shared_ptr<int> anotherSharedPtr = sharedPtr;// 引用计数为2,因为有两个 shared_ptr 指向相同的内存// ...// 当最后一个指向内存的 shared_ptr 被销毁时,内存会被释放return 0;
}

2.std::unique_ptr:

  • std::unique_ptr 确保在任何时候只有一个智能指针可以管理特定的内存块。
  • 不能直接复制或赋值 unique_ptr,因为这违反了“独占所有权”的原则。
  • 当 unique_ptr 被销毁时,它所管理的内存也会被释放。
#include <memory>int main() {// 创建一个 unique_ptr,它独占一个动态分配的整数std::unique_ptr<int> uniquePtr = std::make_unique<int>(42);// 不能这样做,因为这违反了独占所有权的原则// std::unique_ptr<int> anotherUniquePtr = uniquePtr;// ...// 当 uniquePtr 被销毁时,它所管理的内存会被释放return 0;
}

使用智能指针的C++图形应用程序

在现代C++中,智能指针是一种强大的工具,用于更安全和方便地管理动态内存。本文将演示一个简单的图形应用程序示例,展示如何使用 std::shared_ptrstd::unique_ptr 来管理图形对象的内存。

实际应用示例

假设我们正在编写一个图形应用程序,需要处理不同类型的图形对象。我们将创建一个简单的图形类层次结构,并使用智能指针来管理这些对象的内存。

#include <iostream>
#include <memory>
#include <vector>// 抽象基类 Shape
class Shape {
public:virtual void draw() const = 0;virtual ~Shape() {std::cout << "Shape Destructor" << std::endl;}
};// 派生类 Circle
class Circle : public Shape {
public:void draw() const override {std::cout << "Drawing a Circle" << std::endl;}~Circle() {std::cout << "Circle Destructor" << std::endl;}
};// 派生类 Square
class Square : public Shape {
public:void draw() const override {std::cout << "Drawing a Square" << std::endl;}~Square() {std::cout << "Square Destructor" << std::endl;}
};int main() {// 使用 shared_ptr 管理 Shape 对象的动态分配内存std::shared_ptr<Shape> circlePtr = std::make_shared<Circle>();std::shared_ptr<Shape> squarePtr = std::make_shared<Square>();// 使用 unique_ptr 管理 Shape 对象的动态分配内存std::unique_ptr<Shape> anotherCirclePtr = std::make_unique<Circle>();// 将智能指针存储在容器中std::vector<std::shared_ptr<Shape>> shapes;shapes.push_back(circlePtr);shapes.push_back(squarePtr);// 使用 std::move 将所有权转移给容器shapes.push_back(std::move(anotherCirclePtr));// 调用 draw 方法for (const auto& shape : shapes) {shape->draw();}// 当 main 函数结束时,所有的智能指针将被销毁,从而释放相关内存return 0;
}

相关文章:

面试问题--智能指针

什么是智能指针&#xff1f; 当你在编写程序时&#xff0c;可能需要在运行时动态分配内存来存储数据。在传统的C中&#xff0c;你可能会使用 new 和 delete 操作符来手动管理内存。但是这样容易出现一些问题&#xff0c;比如忘记释放内存导致内存泄漏&#xff0c;或者释放了之…...

向量机SVM原理理解和实战

目录 概念场景导入 点到超平面的距离公式 最大间隔的优化模型 硬间隔、软间隔和非线性 SVM 用 SVM 如何解决多分类问题 1. 一对多法 2. 一对一法 SVM主要原理和特点 原理 优点 缺点 支持向量机模型分类 SVM实战如何进行乳腺癌检测 数据集 字段含义 代码实现 参…...

什么是 Node.js?

在 Node.js 出现之前&#xff0c;最常见的 JavaScript 运行时环境是浏览器&#xff0c;也叫做 JavaScript 的宿主环境。浏览器为 JavaScript 提供了 DOM API&#xff0c;能够让 JavaScript 操作浏览器环境&#xff08;JS 环境&#xff09;。 2009 年初 Node.js 出现了&#xf…...

系列九、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式&#xff0c;Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明&#xff0c;是指在配置文件中声明&#xff0c;用在Spring配置文件中声明式的处理事务来…...

c盘清理——常用方法和工具整理

背景 最近c盘满了&#xff0c;只剩下1-2G&#xff0c;周末有空清理一下。对这块不太熟悉&#xff0c;下面只是把今天网上看到的比较好用的工具整理一下。 使用工具 磁盘大小查看工具——TreeSize&#xff08;收费&#xff09; 之前都是右键一个个看每个文件的大小&#xff0…...

【React】打包体积分析 source-map-explorer

通过分析打包体积&#xff0c;才能知道项目中的哪部分内容体积过大&#xff0c;方便知道哪些包需要进一步优化。 使用步骤 安装分析打包体积的包&#xff1a;npm i source-map-explorer在 package.json 中的 scripts 标签中&#xff0c;添加分析打包体积的命令对项目打包&…...

Zookeeper(一):在WSL单机搭建Zookeeper伪集群

目录 Zookeeper1 启动单个Zookeeper实例1.1 下载Zookeeper安装包并解压1.2 添加环境变量1.3 修改默认配置1.4 新建数据存储目录和日志目录1.5 启动Zookeeper1.6 停止Zookeeper 2 搭建Zookeeper集群2.1 新建集群目录2.2 配置环境变量2.3 创建节点目录2.4 修改配置2.5 创建节点ID…...

Go语法的特殊之处

上文我们讲了GO模块引入指令Go Mod&#xff0c;本文讲述Go语法的特殊之处 : 单变量 : hello:“hello” Go 语言中新增了一个特殊的运算符:&#xff0c;这个运算符可以使变量在不声明的情况下直接被赋值使用。其使用方法和带值声明变量类似&#xff0c;只是少了var关键字&…...

浏览器v8垃圾回收机制和内存泄漏分析-初级

借鉴&#xff1a;一文搞懂V8引擎的垃圾回收 - 掘金 (juejin.cn) 聊聊V8引擎的垃圾回收 - 掘金 (juejin.cn) 内存泄漏方向&#xff1a; 1、全局变量 未手动清除 2、定时器 未手动清除 3、闭包中使用了匿名函数 未手动清除 4、dom被赋值使用后 未手动清除 其他解决方式 1、…...

hdlbits系列verilog解答(7420 chip)-49

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本次将实现7420逻辑芯片,它内部有2个4输入的与非门电路,外部有8个输入和2个输出管脚,功能框图如下所示: 二、verilog源码 module top_module ( input p1a, p1b, p1c, p1d,output p1y,input p2a, p2b, p2c…...

Sentinel核心类解读:Entry

默认情况下&#xff0c;Sentinel会将controller中的方法作为被保护资源&#xff0c;Sentinel中的资源用Entry来表示。 Sentinel中Entry可以理解为每次进入资源的一个凭证&#xff0c;如果调用SphO.entry()或者SphU.entry()能获取Entry对象&#xff0c;代表获取了凭证&#xff…...

YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;官方代码地址 一、本文介绍 本文给大家带来的改进机制是可切换的空洞卷积&#xff08;Switchable Atrous Convolution, SAC&#xff09;是一种创新的卷积网络机制&#xff0c;专为增强物体检测和分割任务中的特征提取而…...

可以ping通IP但是无法远程连接-‘telnet‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

起因 一开始远程连接IP&#xff0c;报错&#xff0c;怀疑是自己网络原因&#xff0c;但是同事依旧无法连接 怀疑是自己防火墙的原因&#xff0c;查看关闭依旧无法连接 问题 两个地址可以ping通排除防火墙缘故 怀疑端口&#xff0c;测试端口 然 解决方案 winR 输入control…...

使用VC++设计程序:实现常见的三种图像插值算法:最近邻插值,双线性插值,立方卷积插值

图像放大的三种插值算法 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章&#xff1a; 01- 一元熵值、二维熵值 02- 图像平移变换&#xff0c;图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 04-…...

多级嵌套vue同步调用用法

//需求 要求同步调用initGame2方法 //调用方法 this.initSocket(); //定义方法为同步 async initSocket() { //调用为同步 await this.initGame2(); //定义方法为同步 async initGame2() {const e await w({ url: //定义w方法 const w e.create({ baseURL: http://my_url:8…...

C#,《小白学程序》第八课:列表(List)其二,编制《高铁列车时刻表》与时间DateTime

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary&g…...

高德地图使用逆地理编码服务

进入高德地图开发者平台申请web服务&#xff0c;并获取web服务生成的key下面是高德地图官网的逆地理编码服务使用说明https://lbs.amap.com/api/webservice/guide/api/georegeo/ getAddressByLocation(latitude, longitude) {const key key; // 高德地图key密钥const url h…...

ArgoCD基本组件

ArgoCD有5个基本组件&#xff0c; $ kubectl get po -n argocd NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 19h argocd-dex-server-767fb49f59-7rxn7 1/1 Running 0…...

技术分享 | 在 IDE 插件开发中接入 JCEF 框架

项目背景 当前的开发环境存在多种不同语言的 IDE&#xff0c;如 JetBrains 全家桶、Eclipse、Android Studio 和 VS Code 等等。由于每个 IDE 各有其特定的语言和平台要求&#xff0c;因此开发 IDE 插件时&#xff0c;需要投入大量资源才能尽可能覆盖大部分工具。同时&#xf…...

ubuntu 使用webrtc_ros 编译linux webrtc库

ubuntu 使用webrtc_ros 编译linux webrtc库 webrtc_ros 使用WebRTC流式传输ROS图像主题 该节点提供了一个WebRTC对等方&#xff0c;可以将其配置为流ROS图像主题并接收发布到ROS图像主题的流。 该节点托管一个提供简单测试页面的Web服务器&#xff0c;并提供可用于创建和配置W…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...