这些指针是由 TR1 智能指针演变而来。注意! 智能指针是类型而非一般指针。
shared_ptr
是一引用计数 (reference-counted) 指针,其行为与一般 C++ 指针即为相似。在 TR1 的实现中,缺少了一些一般指针所拥有的特色,像是别名或是指针运算。C++11新增前述特色。
一个 shared_ptr
只有在已经没有任何其它 shared_ptr
指向其原本所指向对象时,才会销毁该对象。
一个 weak_ptr
指向的是一个被 shared_ptr
所指向的对象。该 weak_ptr
可以用来决定该对象是否已被销毁。weak_ptr
不能被解参考; 想要访问其内部所保存的指针,只能通过 shared_ptr
。有两种方法可达成此目的。第一,类型 shared_ptr
有一个以 weak_ptr
为参数的构造函数。第二,类型 weak_ptr
有一个名为 lock
的成员函数,其返回值为一个 shared_ptr
。weak_ptr
并不拥有它所指向的对象,因此不影响该对象的销毁与否。
底下是一个 shared_ptr
的使用样例:
int main( ) { std::shared_ptr<double> p_first(new double) ; { std::shared_ptr<double> p_copy = p_first ; *p_copy = 21.2; } // 此時 'p_copy' 會被銷毀,但動態分配的 double 不會被銷毀。 return 0; // 此時 'p_first' 會被銷毀,動態分配的 double 也會被銷毀 (因為不再有指針指向它)。 }
auto_ptr
将会被 C++ 标准所废弃,取而代之的是 unique_ptr
。 unique_ptr
提供 auto_ptr
大部份特性,唯一的例外是 auto_ptr
的不安全、隐性的左值搬移。不像 auto_ptr
,unique_ptr
可以存放在 C++11 提出的那些能察觉搬移动作的容器之中。
C++98 定义的唯一的智能指针类 auto_ptr 已经被弃用,C++11 引入了新的智能针对类 shared_ptr 和 unique_ptr。它们都是标准库的其它组件兼容,可以安全地把智能指针存入标准容器,也可以安全地用标准算法“倒腾”它们。