boost - 智能指针之scoped_ptr

scoped_ptr不具备“value”语义,不可以进行拷贝和赋值,因此不涉及所有权(ownership)的转化,因此比起std::auto_ptr和boost:shared_ptr更加安全。
其只是遵循RAII(Resource Acquisition Is Initialisation)原则,对象初始化时即获取资源,对象析构时释放资源。
使用scoped_ptr可以简化代码,保证异常安全.
scoped_ptr实现简单,与原始指针效率相当.
注意:scoped_ptr不可以用在STL标准容器中;scoped_ptr不可以保存动态分配的数组指针
Example

#include <boost/scoped_ptr.hpp>
#include <iostream>

struct Shoe { ~Shoe() { std::cout << “discard my shoe\n”; } };

class MyClass {
boost::scoped_ptr<int> ptr;
public:
MyClass() : ptr(new int) { *ptr = 0; }
int add_one() { return ++*ptr; }
};

int main()
{
boost::scoped_ptr<Shoe> x(new Shoe);
[...]

boost之-intrusive_ptr说明

介绍:
intrusive_ptr类模板内部保存一个指针,这个指针所指对象必须具有嵌入式的内部计数。
intrusive_ptr可以为开发人员提供一个针对这个指针的上层封装,这样用户使用intrusive_ptr进行
拷贝,赋值等相关操作,内部计数会自动的进行addref(增加引用)或release(减少引用)的操作。
为开发人员提供编码简单,异常安全的特性。
因此instrusive_ptr存在的意义如下:
1, 支持某些操作系统中原有的具有引用计数的指针
2, 方便用户操作具有引用技术的指针
3, 保证代码异常安全
注意,由于各种对象在实现内部计数时,可能接口函数不同,如A class可能使用add_ref和release_ref,
B class可能使用addref和release,每个开发人员有自己不同的编码风格,命名风格。因此intrusive_ptr
要求这些类的作者必须在boost的全局命名空间中提供两个函数:
intrusive_ptr_add_ref 用来增加计数
intrusive_ptr_release 用来减少计数
依据这个要求,A class必须在A的定义后,定义下面的函数:

void intrusive_ptr_add_ref(A * p)
{
p->add_ref();
}
void intrusive_ptr_release(A * p)
{
p->release_ref();
}

intrusive_ptr的定义中会调用这两个函数,稍后我们查看intrusive_ptr的代码时可以看到。
intrusive_ptr代码片段:

namespace boost {
template<class T> class intrusive_ptr {
public:
typedef T element_type;
intrusive_ptr(); // never throws
intrusive_ptr(T * p, bool [...]