0

0

C++怎么使用shared_ptr_C++资源管理教程【共享】

冰火之心

冰火之心

发布时间:2026-03-01 15:01:02

|

698人浏览过

|

来源于php中文网

原创

shared_ptr构造传nullptr不会崩溃,但解引用会触发未定义行为;reset()释放旧资源且不影响其他共享者,而=赋值更安全且原子;make_shared更高效因单次分配;循环引用需用weak_ptr破。

c++怎么使用shared_ptr_c++资源管理教程【共享】

shared_ptr 构造时传 nullptr 会崩溃吗

不会崩溃,但容易误以为“安全”而忽略后续解引用风险。std::shared_ptr<int> p(nullptr)</int> 是合法的,p 确实持有空指针、引用计数为 1,但一旦写 *pp->xxx 就触发未定义行为(通常是段错误)。

  • 常见错误现象:shared_ptr 从工厂函数返回前被意外赋值为 nullptr,调用方没检查就直接解引用
  • 正确做法:构造后用 if (p)p != nullptr 显式判空,别依赖隐式转换
  • 注意:shared_ptr<t>()</t>shared_ptr<t>(nullptr)</t> 效果一致,但后者语义更明确

reset() 和赋值 = 的区别在哪

关键在是否释放旧资源、是否影响其他共享该对象的 shared_ptr 实例。

  • p.reset(new int(42)):先释放 p 当前持有的资源(如果非空),再接管新对象;其他同享该对象的 shared_ptr 不受影响
  • p = std::make_shared<int>(42)</int>:同样会释放旧资源,但更安全(避免裸指针泄漏);且 = 是原子操作,适合多线程场景下替换整个智能指针
  • 坑点:p.reset()(无参)等价于 p.reset(nullptr),会清空指针但保留控制块——内存没全释放,可能造成轻微浪费

为什么 make_shared 比 shared_ptr(new T) 更高效

因为一次内存分配搞定控制块 + 对象本体,而 shared_ptr(new T) 至少要两次分配(new 一次,控制块再 new 一次)。

Clippah
Clippah

AI驱动的创意视频处理平台

下载
  • 性能影响:小对象差异不明显,但高频创建时分配次数减半,缓存局部性更好
  • 兼容性限制:make_shared 要求 T 的构造函数可访问(不能是私有或 explicit 构造函数被隐式调用)
  • 例外场景:需要自定义删除器(deleter)或别名构造(aliasing constructor)时,只能用 shared_ptr 构造函数,不能用 make_shared

循环引用导致内存泄漏怎么破

两个 shared_ptr 相互持有对方所管对象,引用计数永远不归零,析构不触发。

立即学习C++免费学习笔记(深入)”;

  • 典型场景:父子结构(如树节点)、观察者模式中回调捕获自身 shared_ptr
  • 解法:把其中一端改成 std::weak_ptr,访问前用 lock() 升级成临时 shared_ptr,失败说明对象已销毁
  • 容易踩的坑:在 lambda 中捕获 shared_ptr 后又把它赋给成员变量,形成隐式循环;改用 [weak = weak_from_this()] 捕获更安全
C++ 的 shared_ptr 不是万能胶水,它只解决“谁负责释放”的问题,不自动解决“谁该持有”和“何时持有”的逻辑问题。最常出错的地方,恰恰藏在看似最省事的写法里——比如直接 = 赋值、不检查空、或者在闭包里随手捕获 this

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

836

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

890

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

595

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

60

2026.01.05

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号