讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

C++智能指针shared_ptr的作用?(自动管理内存引用计数)

陌芳大大_6067

陌芳大大_6067

发布时间:2026-01-15 14:09:11

|

791人浏览过

|

来源于php中文网

原创

shared_ptr解决多对象共享堆内存时的手动管理难题,通过引用计数自动释放资源;每个实例绑定控制块记录引用数,拷贝增、析构减,归零时delete;须避免裸指针重复构造,推荐make_shared或拷贝创建。

c++智能指针shared_ptr的作用?(自动管理内存引用计数)

shared_ptr 解决什么问题

手动管理动态内存时,new 和 delete 容易配对失败,导致内存泄漏或重复释放。当多个对象或函数需要共享同一块堆内存(比如一个数据结构被多个模块读写),用裸指针根本无法安全判断“现在还能不能删”。shared_ptr 就是为这种场景设计的:它把“谁还在用这块内存”这个信息显式记录下来,靠引用计数自动决定何时释放。

引用计数怎么工作的

每个 shared_ptr 实例背后绑着一个控制块(control block),里面存着指向实际对象的指针和一个引用计数。每次拷贝构造、赋值或作为参数传入,计数加 1;超出作用域、重置或被赋值为另一个 shared_ptr 时,计数减 1。计数归零,控制块才调用 delete 销毁对象。

注意:两个指向同一地址的 shared_ptr 必须由同一个原始 shared_ptr 派生,否则控制块不共享,会 double-delete:

int* raw = new int(42);
std::shared_ptr<int> a(raw);  // ❌ 危险!a 独占控制块
std::shared_ptr<int> b(raw);  // ❌ b 另建控制块 → 后续析构两次 delete raw

正确做法是始终用 std::make_shared 构造,或通过拷贝已有 shared_ptr:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

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

auto a = std::make_shared<int>(42);  // ✅ 推荐
auto b = a;                            // ✅ 共享同一控制块

和 unique_ptr、weak_ptr 的关键区别

unique_ptr 是独占语义:不可拷贝,只能移动,适合“我管到底”的场景;shared_ptr 是共享语义:可拷贝,但有运行时开销(控制块内存 + 原子计数);weak_ptr 不增加引用计数,只用于打破循环引用 —— 比如父子节点互相持有 shared_ptr,就会导致计数永远不归零。

  • 性能敏感且所有权明确?优先选 unique_ptr
  • 需要多处共享且生命周期不确定?用 shared_ptr
  • 共享中还要观察对象是否还活着(比如缓存、监听器列表)?配合 weak_ptr::lock() 使用

容易踩的坑

常见错误不是语法问题,而是语义误用:

  • 把裸指针传给多个 shared_ptr 构造函数 → double-delete
  • 在类成员里用 shared_ptr 持有 this(比如异步回调里保存 shared_from_this()),但忘了该类必须继承自 std::enable_shared_from_this
  • 在循环引用场景下没引入 weak_ptr,导致内存永远不释放
  • 误以为 shared_ptr 能管理栈对象或全局对象 —— 它只应配合堆分配(new 或 make_shared)

引用计数本身是线程安全的(增减原子),但所指对象的访问仍需额外同步 —— 这点常被忽略。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

4668

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

904

2025.10.23

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2901

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

416

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

492

2026.05.09

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6967

2023.07.18

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB Reference Card
GDB Reference Card

共0课时 | 0人学习

《Debugging with GDB》用户手册
《Debugging with GDB》用户手册

共0课时 | 0人学习

Valgrind FAQ
Valgrind FAQ

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn