智能指针的核心价值在于明确间接访问资源的所有权关系。若仅考虑标准库提供的设施(无论是否“智能”),我们拥有以下选择:
类型 | 场景 |
---|---|
unique_ptr |
所有权语义:单一所有权。 值得注意的特殊成员函数:不可复制。析构函数负责销毁对象。 |
shared_ptr |
所有权语义:共享所有权。 值得注意的特殊成员函数:复制、赋值和销毁更新共享使用计数。 最后一个共享者负责使用析构函数销毁指针和使用计数。 |
T* | 所有权语义:在类型系统中没有定义所有权(所有权规则必须包含在用户代码中)。 值得注意的特殊成员函数:不适用(这是一个基本类型)。 |
总体而言,现有的选择并不多。为了完善这个表格,还可以考虑实现哪些其他语义的指针呢?可能包括:
observer_ptr
non_null_ptr
remote_ptr
dup_ptr
我们不会实现所有类型(特别是remote_ptr<T>虽然有趣但超出本书范围),但会实现其中几种。每种情况的关键在于:明确定义预期语义,确保这些语义未被现有类型覆盖,并正确进行实现。
先从实现最著名的标准智能指针unique_ptr(简化版本)开始。