6.2. 所有权语义剖析

智能指针的核心价值在于明确间接访问资源的所有权关系。若仅考虑标准库提供的设施(无论是否“智能”),我们拥有以下选择:

类型 场景
unique_ptr 所有权语义:单一所有权。
值得注意的特殊成员函数:不可复制。析构函数负责销毁对象。
shared_ptr 所有权语义:共享所有权。
值得注意的特殊成员函数:复制、赋值和销毁更新共享使用计数。
最后一个共享者负责使用析构函数销毁指针和使用计数。
T* 所有权语义:在类型系统中没有定义所有权(所有权规则必须包含在用户代码中)。
值得注意的特殊成员函数:不适用(这是一个基本类型)。
表6.1 —— 指针类型的使用分类

总体而言,现有的选择并不多。为了完善这个表格,还可以考虑实现哪些其他语义的指针呢?可能包括:

我们不会实现所有类型(特别是remote_ptr<T>虽然有趣但超出本书范围),但会实现其中几种。每种情况的关键在于:明确定义预期语义,确保这些语义未被现有类型覆盖,并正确进行实现。

先从实现最著名的标准智能指针unique_ptr(简化版本)开始。