新闻中心
c++怎么使用shared_ptr_c++ shared_ptr智能指针详解
std::shared_ptr通过引用计数管理动态对象,使用make_shared创建并共享所有权,引用计数为0时自动释放资源;可自定义删除器处理特殊资源;需用weak_ptr打破循环引用以防内存泄漏。

在C++中,std::shared_ptr 是一种智能指针,用于管理动态分配的对象,实现共享所有权的机制。它通过引用计数自动追踪有多少个 shared_ptr 指向同一个对象,当最后一个指向该对象的 shared_ptr 被销毁或重置时,对象会自动被删除,从而避免内存泄漏。
1. 包含头文件和基本用法
要使用 shared_ptr,需要包含
#include iostream>
创建一个 shared_ptr 的常用方式是使用 std::make_shared,这是推荐的做法,因为它更高效且异常安全:
std::cout
2. 共享所有权与引用计数
多个 shared_ptr 可以指向同一个对象,每增加一个引用,引用计数加1;减少一个则减1。
{
auto p2 = p1; // 引用计数变为 2
std::cout } // p2 离开作用域,引用计数减为 1
std::cout
use_count() 返回当前对象的引用数量,仅用于调试,不要依赖它做逻辑判断。
3. 自定义删除器
有时需要自定义资源释放逻辑,比如关闭文件、释放非new分配的内存等,可以传入删除器:
Pinokio
Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用
232
查看详情
void close_file(FILE* fp) {if (fp) fclose(fp);
}
auto file_ptr = std::shared_ptr
if (file_ptr) {
fprintf(file_ptr.get(), "Hello, shared_
ptr!\n");} // 离开作用域时自动调用 close_file
删除器可以是函数、lambda 或仿函数。
4. 注意循环引用问题
当两个对象通过 shared_ptr 相互持有对方时,引用计数永远不为0,导致内存泄漏:
using NodePtr = std::shared_ptr
struct Node {
NodePtr parent;
NodePtr child;
~Node() { std::cout };
auto a = std::make_shared
auto b = std::make_shared
a->child = b;
b->parent = a; // 循环引用,无法释放
解决方法是使用 std::weak_ptr 打破循环:
struct Node {std::weak_ptr
NodePtr child;
~Node() { std::cout };
这样当外部引用消失时,对象能被正确释放。
基本上就这些。合理使用 shared_ptr 能显著提升代码安全性,但要注意避免循环引用,优先使用 make_shared 创建实例。
以上就是c++++怎么使用shared_ptr_c++ shared_ptr智能指针详解的详细内容,更多请关注其它相关文章!
# c++
# 相关文章
# 多个
# 是一种
# 与其他
# 头文件
# 这是
# 如何使用
# red
# 作用域
# 解决方法
# stream
# ios
# node
# 自定义
# 安徽营销推广加盟公司
# 金华推荐网站推广排名
# 徐州网站优化怎样做
# 忻州网站建设联系人
# 广东门窗网站优化效果
# 简谱网站建设美丽
# 湖北关键词排名怎么优化
# 青海网站优化制作
# 谷歌seo和外贸推广
# 为什么网站会优化呢知乎
# 中文网
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
如何在网页中实现特定地点的随机图片展示
msn官网入口地址手机版 msn官方网站手机最新链接
顺丰快件物流信息 官方网站查询入口
探索高级语言到原生C/C++的转译:挑战与内存管理策略
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
AI泡沫首次被“刺破”:GPU十年都无法存活!
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
AO3最新镜像入口 Archive of Our Own官方平台访问
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
如何在CSS中使用浮动制作导航栏_float实现水平菜单
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
蛙漫安全无毒 官方认证的绿色入口
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
韩小圈电脑版在线入口_网页版免费登录地址
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
qq游戏免费畅玩入口_qq游戏电脑版快速启动
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
使用Pandas转换并合并DataFrame:多列映射至统一结构
微信网页版官方入口教程 微信网页版网页版快速登录步骤
Pyrogram与g4f集成:异步编程实践与常见错误解决
浏览器打开即用 美图秀秀网页版入口
顺丰快递查单号物流信息 顺丰快递小程序查询入口
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
J*aScript中在Map循环中检测并处理空数组元素
电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】
照顾宝贝2小游戏免费秒玩入口
必由学网页版入口 必由学官方平台直接访问
uc浏览器网页版入口 uc浏览器网页版最新网址
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
使用Python高效删除Word宏并转换DOCM为DOCX格式
C++ explicit关键字防止隐式转换_C++构造函数安全规范
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
淘宝支付提示失败如何解决 淘宝支付流程优化方法
如何在J*a中使用Locale处理多语言环境
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
b站赚钱渠道_b站收益来源
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
深入理解Promise链:如何在catch后中断then的执行


2025-10-30
浏览次数:次
返回列表