新闻中心

c++怎么使用shared_ptr_c++ shared_ptr智能指针详解

2025-10-30
浏览次数:
返回列表
std::shared_ptr通过引用计数管理动态对象,使用make_shared创建并共享所有权,引用计数为0时自动释放资源;可自定义删除器处理特殊资源;需用weak_ptr打破循环引用以防内存泄漏。

c++怎么使用shared_ptr_c++ shared_ptr智能指针详解

在C++中,std::shared_ptr 是一种智能指针,用于管理动态分配的对象,实现共享所有权的机制。它通过引用计数自动追踪有多少个 shared_ptr 指向同一个对象,当最后一个指向该对象的 shared_ptr 被销毁或重置时,对象会自动被删除,从而避免内存泄漏。

1. 包含头文件和基本用法

要使用 shared_ptr,需要包含 头文件:

#include
#include iostream>

创建一个 shared_ptr 的常用方式是使用 std::make_shared,这是推荐的做法,因为它更高效且异常安全:

auto ptr = std::make_shared(42);
std::cout

2. 共享所有权与引用计数

多个 shared_ptr 可以指向同一个对象,每增加一个引用,引用计数加1;减少一个则减1。

auto p1 = std::make_shared(100);
{
    auto p2 = p1; // 引用计数变为 2
    std::cout } // p2 离开作用域,引用计数减为 1
std::cout

use_count() 返回当前对象的引用数量,仅用于调试,不要依赖它做逻辑判断。

3. 自定义删除器

有时需要自定义资源释放逻辑,比如关闭文件、释放非new分配的内存等,可以传入删除器:

Pinokio Pinokio

Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用

Pinokio 232 查看详情 Pinokio void close_file(FILE* fp) {
    if (fp) fclose(fp);
}

auto file_ptr = std::shared_ptr(fopen("test.txt", "w"), close_file);
if (file_ptr) {
    fprintf(file_ptr.get(), "Hello, shared_ptr!\n");
} // 离开作用域时自动调用 close_file

删除器可以是函数、lambda 或仿函数。

4. 注意循环引用问题

当两个对象通过 shared_ptr 相互持有对方时,引用计数永远不为0,导致内存泄漏:

struct Node;
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 parent; // 不增加引用计数
    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的执行 

搜索