当前位置: 首页 > 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;
}

相关文章:

  • U盘报错无法访问文件或目录损坏且无法读取的解决办法
  • Proteus仿真--高仿真数码管电子钟
  • 了解JSX
  • vue升级题
  • 电子学会C/C++编程等级考试2021年09月(三级)真题解析
  • C#,《小白学程序》第十八课:随机数(Random)第五,方差及标准方差(标准差)的计算方法与代码
  • 1panel在应用商店里面安装jenkins
  • LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
  • C_5练习题
  • leetcode面试经典150题——31 无重复字符的最长子串(方法二极简代码!!!)
  • 操作系统题目分类总结 | 进程管理 内存管理 文件系统 设备管理
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十二)
  • HCIP中期实验
  • CentOS7安装Docker运行环境
  • Echarts title标题配置项的使用 更改颜色 副标题
  • 【node学习】协程
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 3.7、@ResponseBody 和 @RestController
  • Centos6.8 使用rpm安装mysql5.7
  • CODING 缺陷管理功能正式开始公测
  • ComponentOne 2017 V2版本正式发布
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • dva中组件的懒加载
  • js 实现textarea输入字数提示
  • mongodb--安装和初步使用教程
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 彻底搞懂浏览器Event-loop
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 聊聊flink的TableFactory
  • 入口文件开始,分析Vue源码实现
  • 深度学习中的信息论知识详解
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​如何在iOS手机上查看应用日志
  • ​用户画像从0到100的构建思路
  • #DBA杂记1
  • #QT项目实战(天气预报)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (笔试题)分解质因式
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)德国人的记事本
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net6Api后台+uniapp导出Excel
  • .NET单元测试
  • .NET多线程执行函数
  • .NET项目中存在多个web.config文件时的加载顺序
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • ::
  • @ModelAttribute 注解
  • @WebServiceClient注解,wsdlLocation 可配置
  • [20171101]rman to destination.txt
  • [AIGC codze] Kafka 的 rebalance 机制
  • [C++提高编程](三):STL初识