C++智能指针种类以及使用场景

一、指针管理的困境

  1. 资源释放了,指针没有置空

    野指针:只有一个指针指向资源

    指针悬挂:多个指针指向同一个资源

    踩内存

  2. 没有释放资源,产生内存泄漏

  3. 重复释放资源,引发 coredump

二、如何解决?

  1. 智能指针采用了 RAIl 思想来自动化管理指针所指向的动态资源的释放

  2. RAIl 主要利用了对象的生命周期来控制程序资源

  3. 智能指针利用类的构造函数和析构函数来管理资源

三、智能指针种类

1.shared_ptr

语义:共享所有权

资源没有明确的拥有者

原理:引用计数

场景:容器中管理指针;资源通过函数传递

使用规范:

  • 使用shared ptr来管理动态资源的时候,不要使用原来的裸指针
    构造智能指针的时候,不要暴露裸指针
    尽量使用make_shared 来构造智能指针
    不要通过 get 来操作裸指针
    不要用一个指针构造多个智能指针对象
  • 要用类对象指(this)作为 shared_ptr 返回
  • 不能暴露裸指针

2.weak_ptr

辅助shared_ptr,用来解决 shared_ptr 循环引用,原因是弱引用不占用强引用计数

3.unique_ptr

语义:独享所有权

没有拷贝构造

没有赋值运算操作符

仅提供了移动构造,和移动赋值

明确某个对象只有一个拥有者

使用规范:

  • 不支持拷贝,但是可以从函数中返回一个 unique_ptr

    编译器优化

    如果关闭编译器优化:有移动构造,调用移动构造;有拷贝构造,调用拷贝构造;没有拷贝构造,报错

  • make unique 但是 c++14 才提供


推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/VsFMs

相关推荐
ydjs678899-bot21 分钟前
您的Next.js中间件匹配器配置可能会跳过您认为它保护的路由
开发语言·javascript·中间件
局部有解21 分钟前
LeetCode Hot100 438 找到字符串中所有字母异位词
c++·算法·leetcode
Chengbei1129 分钟前
JsOwl|AI 赋能 JS 敏感信息扫描器,AST + 正则、source‑map 源码还原、登录态爬虫输出交互式 HTML 报告
开发语言·javascript·网络·人工智能·爬虫·网络安全·自动化
David猪大卫31 分钟前
【C++修炼】string类:string类的模拟实现
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
geovindu33 分钟前
rust: Iterator Pattern
开发语言·后端·设计模式·rust·行为模式·迭代器模
SDWAN_Cheap1 小时前
深度解析什么是CDN加速:从原理到实践的技术拆解
开发语言·cdn加速
鬼手点金1 小时前
模型即 Agent:当模型本身成为产品
开发语言·前端·人工智能·python·机器学习
染指11101 小时前
147.Agent-LangGraph归并函数
开发语言·人工智能·python·langchain·agents
Elastic 中国社区官方博客1 小时前
教程:监控 Java 应用
java·开发语言·数据库·elasticsearch·搜索引擎·全文检索
ShineWinsu1 小时前
对于JavaScript:初识JavaScript以及输入输出
java·开发语言·前端·javascript·css·面试·html