
然后我们分配了第二个指针mySample2,现在有两个指针访问同一个数据。

我们重置第一个指针(将mySample设置为空),程序中仍然有一个Csample实例,mySample2有一个引用指针。

只要当最有一个引用指针mySample2退出了它的作用域之外,Csample这个实例才被销毁。

当然,并不仅限于单个Csample这个实例,或者是两个指针,一个函数,下面是用shared_ptr的实例:
· 用作容器中。
· 用在PIMPL的惯用手法 (the pointer-to-implementation idiom )。
· RAII(Resource-Acquisition-Is-Initialization)的惯用手法中。
· 执行分割接口。
注意:如果你没有听说过PIMPL (a.k.a. handle/body) 和 RAII,可以找一个好的C++书,在C++中处于重要的内容,一般C++程序员都应该知道(不过我就是第一次看到这个写法)。智能指针只是一中方便的他们的方法,本文中不讨论他们的内容。
PIMPL:如果必须包容一个可能抛异常的子对象,但仍然不想从你自己的构造函数中抛出异常,考虑使用被叫做Handle Class或Pimpl的方法(“Pimpl”个双关语:pImpl或“pointer to implementation”)
4、 主要特点
boost::shared_ptr 有一些重要的特征必须建立在其它操作之上。
· shared_ptr<T>作用在一个未知类型上
当声明或定义一个shared_ptr<T>,T可能是一个未知的类型。例如你仅仅在前面声明了class T,但并没有定义class T。当我们要释放这个指针的时候我们需要知道这个T具体是一个声明类型。
· shared_ptr<T>作用在任意类型上
在这里本质上不需要制定T的类型(如从一个基类继承下来的)
· shared_ptr<T>支持自己定义释放对象的操作
如果你的类中自己写了释放方法,也可以使用。具体参照Boost文档。
· 强制转换
如果你定义了一个U*能够强制转换到T*(因为T是U的基类),那么shared_ptr<U>也能够强制转换到shared_ptr<T>。
· shared_ptr 是线程安全的
(这种设计的选择超过它的优点,在多线程情况下是非常必要的)
· 已经作为一种惯例,用在很多平台上,被证明和认同的。
郑重声明:
允许复制、修改、传递或其它行为
但不准用于任何商业用途.
写于 2004/11/5 masterlee