C++智能指针使用详解

智能指针概述

智能指针是C++标准库提供的类模板,用于自动管理动态分配的内存,防止内存泄漏。它们遵循RAII(资源获取即初始化)原则,在对象生命周期结束时自动释放内存。

主要智能指针类型

std::unique_ptr

独占所有权的智能指针,不能复制,只能移动。

std::shared_ptr

共享所有权的智能指针,使用引用计数管理资源。

std::weak_ptr

弱引用指针,不增加引用计数,用于解决循环引用问题。

智能指针的高级用法

在容器中使用智能指针

存 std::unique_ptr / std::shared_ptr,clear/ erase 时,引用计数 -1,如果计数为0,自动释放内存,完全不用手动 delete!

多态和智能指针

自定义删除器

最佳实践和注意事项

使用建议

常见错误

总结

C++智能指针是现代C++编程中必不可少的工具,它们提供了自动内存管理,帮助防止内存泄漏和其他资源管理错误。关键点总结:

  1. std::unique_ptr:用于独占所有权场景,性能开销小

  2. std::shared_ptr:用于共享所有权场景,使用引用计数

  3. std::weak_ptr:用于解决循环引用问题,提供弱引用

  4. 优先使用make_unique和make_shared:更安全、更高效

  5. 明确所有权语义:在代码中清晰表达资源所有权意图

正确使用智能指针可以大大简化内存管理,提高代码的安全性和可维护性。

析构函数

谁持有谁,谁先死;被持有者,后死。

组合 / 持有关系析构

智能指针

父对象 持有 子对象的 shared_ptr

子对象 不持有 父对象(只持有 weak_ptr)

所以生命周期关系是:

父活着 → 子才能活着

父死了 → 子才会死

先析构子 → 再析构父

只发生在 栈上对象 + 成员对象 的场景。

日志顺序:Parent 析构 → Child 析构

本质和智能指针链一模一样!

依然是:父先开始析构 → 子才被析构

继承关系析构

真正的「先子后父」只发生在继承

只有继承关系析构 是 子类先析构,父类后析构:

相关推荐
是立不是利14 分钟前
大文件导致请求被拒的连锁反应
开发语言·前端·javascript
東隅已逝,桑榆非晚29 分钟前
vector(模拟实现)
c++·笔记·学习
野生技术架构师32 分钟前
1200 道 JAVA 面试题(各大企业常见面试题及答案)
java·开发语言
“AI国潮设计-小江”42 分钟前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁美食猫IP & 创意甜品设计(附ComfyUI工作流思路)
开发语言·人工智能·python·prompt·aigc
Yyyyyy~1 小时前
【java】类和对象
java·开发语言
蒸蒸yyyyzwd1 小时前
cpp 选手备战秋招学习笔记 day36
c++
草莓熊Lotso1 小时前
【Redis 进阶】主从复制深度解析:从配置落地到 PSYNC 同步原理
linux·开发语言·网络·数据库·redis·缓存·php
用户69586106727111 小时前
从源码到加载器:__attribute__((constructor)) / __attribute__((destructor))的跨平台实现原理详解
c++
Joy T1 小时前
Spring AI 2.0 进阶入门:Workflow、Routing、Task State 与可控 Agent
开发语言·人工智能·workflow·routing·springai·orchestrator·evaluator
重生之小比特2 小时前
【Java SE】抽象类和接口
java·开发语言