智能指针 Smart pointers
智能指针的概念, 源自于 C++ 语言. C++ 不支持垃圾回收 (garbage collection), 在引入智能指针之前, 需要开发者手动管理内存的分配与回收.
后来的 C++11 中, 强化了智能指针的概念, 并引入了 std::shared_ptr
和 std::unique_ptr
,
使用这种方式, 极大地简化了对堆内存的管理. 并将 RAII 这种机制推广到管理一般的资源, 比如文件句柄, socket,
数据库连接等等.
所谓的 RAII 机制, 就是使用栈上的对象来管理堆上内存的生命周期的方法. 即在出栈时 会调用这个对象的 destructor 方法, 来释放对应的堆内存.
Rust 也同样不支持垃圾回收, 很多对象的创建与销毁都可以在编译期间确定; 但有时这样的方式不够灵活, 需要 在程序运行期间动态地管理资源. Rust 语言引入了 RAII 机制, 并在标准库的很多地方都有使用. 同样地, 在 Rust 的标准库中, 也有对应的智能智针, 而且种类更加丰富
std::unique_ptr
, 不能共享 heap 上的内存, 对应于std::boxed::Box
std::shared_ptr
, 以引用计数的方式共享 heap 上的内存, 它本身是线程安全的. 对应于std::rc::Rc
(只用于同一线程, 不是线程安全的) 以及std::sync::Arc
(用于线程间共享, 线程安全)std::weak_ptr
, 不以引用计数的方式共享内存, 对应于std::rc::Weak
以及 std::sync::Weak. 它用于辅助
std:: shared_ptr` 以解决循环引用问题, 本身不会影响引用计数的数值
本章学习目标:
- 掌握原始指针的用法
- 掌握常用的几种智能智针
- 了解写时复制机制