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

C++基础面试题 | 介绍C++中三种智能指针的使用场景?

月落乌啼霜满天,江枫渔火对愁眠。 - 《枫桥夜泊 / 夜泊枫江》(张继)

回答重点

在C++中的智能指针利用RAII实现内存分配的管理,避免内存泄漏和其他与动态内存分配相关的问题。C++11中提供了三种主要的智能指针:std::unique_ptrstd::shared_ptrstd::weak_ptr

1. std::unique_ptr

std::unique_ptr是一种独占所有权的智能指针,意味着同一时间内只能有一个unique_ptr指向一个特定的对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。

  • 使用场景:当你需要独占一个资源时,即在任何时刻只有一个指针指向该资源。std::unique_ptr提供了独占所有权模型,这意味着它不允许复制(copy),但允许移动(move),这使得资源的所有权可以在智能指针之间转移,而不会有两个指针同时拥有同一个资源。
    -当你需要智能管理资源,如文件句柄和互斥锁时。
示例代码:
#include <iostream>
#include <memory>class Test {
public:Test() { std::cout << "Test::Test()\n"; }~Test() { std::cout << "Test::~Test()\n"; }void test() { std::cout << "Test::test()\n"; }
};int main() {std::unique_ptr<Test> ptr(new Test());ptr->test();// 当ptr离开作用域时, 它指向的对象会被自动销毁return 0;
}

2. std::shared_ptr

std::shared_ptr是一种共享所有权的智能指针,多个shared_ptr可以指向同一个对象。内部使用引用计数来确保只有当最后一个指向对象的shared_ptr被销毁时,对象才会被销毁。

  • 使用场景:当你需要多个指针共享同一个资源时,std::shared_ptr通过引用计数来管理资源的生命周期。每个std::shared_ptr实例都会持有一个计数器的引用,当最后一个std::shared_ptr被销毁时,资源会被释放。
  • 适用情况:当你的对象需要在多个持有者之间共享,或者当你不确定对象的生命周期应该由谁来管理时,std::shared_ptr是合适的。例如,在一个复杂的对象图中,多个对象可能需要引用同一个资源。
示例代码:
#include <iostream>
#include <memory>class Test {
public:Test() { std::cout << "Test::Test()\n"; }~Test() { std::cout << "Test::~Test()\n"; }void test() { std::cout << "Test::test()\n"; }
};int main() {std::shared_ptr<Test> ptr1(new Test());std::shared_ptr<Test> ptr2 = ptr1;ptr1->test();// 当ptr1和ptr2离开作用域时,它们指向的对象会被自动销毁return 0;
}

3. std::weak_ptr

std::weak_ptr是一种不控制对象生命周期的智能指针,它用来观察std::shared_ptr管理的对象,而不会改变对象的引用计数。std::weak_ptr通常与std::shared_ptr一起使用,以解决强引用循环的问题。

使用场景:

  • 当你需要访问但不拥有由shared_ptr管理的对象时。
  • 当你需要解决shared_ptr之间的循环引用问题时。

注意:weak_ptr肯定要和 shared_ptr一起使用。

示例代码:

#include <iostream>
#include <memory>class Test {
public:Test() { std::cout << "Test::Test()\n"; }~Test() { std::cout << "Test::~Test()\n"; }void test() { std::cout << "Test::test()\n"; }
};int main() {std::shared_ptr<Test> sharedPtr(new Test());std::weak_ptr<Test> weakPtr = sharedPtr;if (auto lockedSharedPtr = weakPtr.lock()) {lockedSharedPtr->test();}// 当sharedPtr离开作用域时,它指向的对象会被自动销毁return 0;
}

更多信息:
https://blog.csdn.net/LiHongyu05/article/details/141184973

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在 ANSA 中 ABAQUS 模板下螺栓预紧力设置
  • C语言 | Leetcode C语言题解之第391题完美矩形
  • Java程序分析工具
  • React 实现PDF预览(数据源使用文件流而不是url)
  • 表连接查询之两个left join与递归SQL
  • 项目实战 ---- 商用落地视频搜索系统(6)---UI 结构及与service互动
  • 项目日志——日志输出格式化模块的设计、实现、测试
  • 【MySQL】MySQL基础
  • C++学习笔记(9)
  • zblog自动生成文章插件(百度AI写作配图,图文并茂)
  • 从材料到应用:螺杆支撑座材质选择的多样性与精准性!
  • 结构化开发方法的三种基本控制结构
  • 为什么构造函数不能为虚函数?为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题?
  • WebShell流量特征检测_蚁剑篇
  • 高级法医视频分析技术 2024
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Median of Two Sorted Arrays
  • ng6--错误信息小结(持续更新)
  • node.js
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue实战(四)登录/注册页的实现
  • XML已死 ?
  • 笨办法学C 练习34:动态数组
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Hibernate主键生成策略及选择
  • 阿里云API、SDK和CLI应用实践方案
  • 带你开发类似Pokemon Go的AR游戏
  • #if 1...#endif
  • #java学习笔记(面向对象)----(未完结)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Java)【深基9.例1】选举学生会
  • (Python第六天)文件处理
  • (二)pulsar安装在独立的docker中,python测试
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (全注解开发)学习Spring-MVC的第三天
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十八)SpringBoot之发送QQ邮件
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)jQuery 基础
  • (转)Oracle存储过程编写经验和优化措施
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .form文件_一篇文章学会文件上传
  • .NET 通过系统影子账户实现权限维持
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .sh
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ 转载 ] SharePoint 资料
  • [Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解