新闻中心
C++智能指针如何使用?C++ smart pointer用法全解析【现代C++】
智能指针是现代C++管理动态内存的核心工具,通过RAII自动释放资源避免内存泄漏和悬空指针;std::unique_ptr独占所有权、不可拷贝可移动;std::shared_ptr共享所有权、引用计数管理;std::weak_ptr观察共享对象、打破循环引用;需避免裸指针混用、错误构造及删除器不匹配等常见坑。

智能指针是现代 C++ 管理动态内存的核心工具,它用对象封装裸指针,自动在合适时机释放资源,从根本上避免内存泄漏和悬空指针。关键不是“要不要用”,而是“怎么选、怎么写、怎么避坑”。
三种智能指针各司其职
std::unique_ptr 表示独占所有权:同一时间只能有一个 unique_ptr 指向某块内存,不可拷贝,但可移动。适合局部资源管理、工厂函数返回、容器中存储独占对象。
- 初始化推荐用
std::make_unique<t>(args...)</t>(C++14 起),避免裸 new 和异常安全问题 - 想转移所有权?用
std::move(ptr),原指针自动变为空 - 需要数组?用
std::unique_ptr<int></int>,析构时自动调用 delete[]
shared_ptr 用于共享所有权
std::shared_ptr 通过引用计数实现多处共享访问。只要还有一个 shared_ptr 指向对象,对象就不会被销毁。适合缓存、观察者、跨模块传递资源等场景。
- 优先用
std::make_shared<t>(args...)</t>构造——它把控制块和对象内存一起分配,更高效且异常安全 - 慎用裸指针构造(如
shared_ptr<int>(new int(42))</int>):可能因 new 成功而 make_shared 失败导致内存泄漏 - 循环引用?用
std::weak_ptr打破。比如 A 持有 B 的 shared_ptr,B 也持有 A 的 shared_ptr → 引用计数永不归零 → 内存泄漏
weak_ptr 是 shared_ptr 的“观察者”
std::weak_ptr 不增加引用计数,只观察 shared_ptr 是否还有效。它不能直接解引用,必须先调用 lock() 获得一个临时 shared_ptr,检查是否非空再使用。
Glarity
Glarity是一款免费开源的AI浏览器扩展,提供YouTube视频总结、网页摘要、写作工具等功能,支持免费的镜像翻译,电子邮件写作辅助,AI问答等功能。
131
查看详情
- 典型用途:缓存、定时器回调、父子关系中的子持有父的 weak_ptr(避免循环引用)
-
expired()可快速判断是否已失效,但仍是竞态敏感操作;线程安全场景下建议直接lock()后判空 - weak_ptr 本身线程安全(读写不同 weak_ptr 对象无冲突),但所指向的对象生命周期仍需业务逻辑保障
别踩这些常见坑
智能指针不是万能胶布,误用反而引入新问题:
- 不要混用智能指针和裸指针管理同一块内存(例如 new 出来后又用 unique_ptr 接管,或 shared_ptr 和 delete 混用)→ 重复释放 UB
- 避免从 this 获取 shared_ptr:类内直接写
shared_from_this(),而不是shared_ptr<myclass>(this)</myclass>(后者会新建控制块,引发双重析构) - 自定义删除器要匹配:比如用 malloc 分配的内存,就得传
[](void* p) { free(p); },否则默认 delete 会崩 - 容器里存 shared_ptr 而不是 raw pointer,尤其当对象生命周期不确定时;但若只是临时遍历且确定不延长生命周期,用引用或 const T& 更轻量
基本上就这些。智能指针不是语法糖,而是 RAII 思维的落地。选对类型、用对构造方式、守住所有权边界,内存管理就能既安全又自然。
以上就是C++智能指针如何使用?C++ smart pointer用法全解析【现代C++】的详细内容,更多请关注其它相关文章!
# 相关文章
# 永州移动网站建设外包
# 密云区互动网站建设
# 网站推广应咨a金脉科技
# 电子社保卡推广营销
# 福海营销推广运营商
# seo项目个人流程
# 优化网站标题意义
# 银川网站建设建议
# 涪陵seo排名优化服务
# 东莞推广营销的公司招聘
# 中文网
# 工具
# 遍历
# 各司其职
# 就能
# 而不是
# 如何用
# 尼克
# 等功能
# 如何使用
# red
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
千牛数据看板网页版_千牛数据看板网页版访问方法
J*aScript map 方法中处理循环元素为空数组的策略
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
mysql备份恢复性能优化_mysql备份恢复性能优化方法
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
在命令行怎么运行html项目_命令行运行html项目方法【教程】
J*aScript类型检查_j*ascript代码规范
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
Python大型XML文件高效流式解析教程
Django模型中自动计算可用余额的实现方法
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道
海量存储:机器视觉智能化的核心基石
2025-2030年全球乘用车销量预测:新能源成增长主力
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
C++ vector二维数组定义_C++ vector of vector用法
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
2026春节假期票务安排_2026春节放假购票指南
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
ArrayList与LinkedList操作复杂度详解:遍历与修改
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
德邦快递查询平台 德邦快递物流信息查询入口
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
163邮箱注册官网 免费申请163个人邮箱
Golang如何使用const iota_Go iota常量计数器讲解
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
学习通网页版官方登录 超星学习通电脑端入口指南
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
零跑汽车11月交付量达70327台 实现连续9个月正增长
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
BetterDiscord插件中安全更新用户简介的实践指南
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
composer的"require-dev"部分是用来做什么的?
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
知音漫客正版漫画平台_知音漫客官网账号登录
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
J*aScript数组对象转换:按指定键分组与值收集
如何将HTML表格多行数据保存到Google Sheet
多闪网页版在线观看免费入口_多闪官网访问入口
Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
DLsite中文平台入口 DLsite官网内容在线查看
c++20的std::jthread是什么_c++可中断线程与RAII式管理


2025-12-14
浏览次数:次
返回列表
通过RAII自动释放资源避免内存泄漏和悬空指针;std::unique_ptr独占所有权、不可拷贝可移动;std::shared_ptr共享所有权、引用计数管理;std::weak_ptr观察共享对象、打破循环引用;需避免裸指针混用、错误构造及删除器不匹配等常见坑。