C++ 智能指针
STL和智能指针关系
1.STL 是标准库的子集:专注于数据结构与算法。
2.智能指针属于 “通用工具库”:与 std::thread、std::future 等工具同属一类,不隶属于 STL 的核心组件。
1. 智能指针
智能指针是一个类模板,通过 RAII(资源获取即初始化)技术封装原始指针,自动管理对象生命周期。
1.核心功能
避免内存泄漏:无需手动调用 delete。
2. RAII(资源获取即初始化)
RAII(Resource Acquisition Is Initialization)是 C++ 中管理资源的核心设计模式,它将资源的生命周期与对象的生命周期绑定,通过对象的构造函数获取资源,析构函数释放资源,从而实现资源的自动管理。
2. 分类
1.std::unique_ptr(独占所有权)
1.特性:独占对象所有权,不可复制,但可移动。
2.应用场景:管理独占资源(如文件句柄、硬件设备)。
2.std::shared_ptr(共享所有权)
1.特性:通过引用计数管理共享对象,最后一个持有者释放内存。
2.应用场景:需要多个指针共享同一对象时(如树形结构)。
3.初始化方式
1.使用原始指针直接初始化(不推荐)
2.使用 std::make_shared(推荐)
优点:
i.异常安全(避免内存泄漏)。
ii.内存分配更高效(仅一次分配,同时存储对象和引用计数)。
3.std::weak_ptr(弱引用)
1.特性:不控制对象生命周期,防止循环引用。
2.应用场景:打破 shared_ptr 的循环引用(如父子对象关系)。
循环引用,没有析构
初始化方式
直接从 shared_ptr 构造
从另一个 std::weak_ptr 初始化
3.常用接口
1.expired() 快速检查对象是否已销毁(等价于 use_count() == 0)。
2.lock() 安全访问对象:返回 shared_ptr,若对象存活则引用计数 + 1,否则返回空。
3.use_count() 获取当前管理对象的 shared_ptr 数量(主要用于调试)。
4.reset() 释放弱引用,变为空 weak_ptr。
5.swap() 交换两个 weak_ptr 的内容。