boost.smart_ptr库提供六种智能指针,分别为shared_ptr、weak_ptr、scoped_ptr、scoped_array、shared_array和instrusive_ptr。它们都是很轻量级的对象,速度与原始指针相差无几,都是异常安全的(exception safe),要求:类型T的析构函数不能抛出异常。
这些智能指针都位于名字空间boost,为了使用smart_ptr组件,需要包含头文件<boost/smart_ptr.hpp>,即:
#include <boost/smart_ptr.hpp>
using namespace boost;
scoped_ptr与auto_ptr相比,所有权更加严格,不能转让,一旦scoped_ptr获取了对象的管理权,就无法再从它那里取回来。
scoped_ptr的构造函数接受一个类型为T*的指针p,创建出一个scoped_ptr对象,并在内部保存指针参数p。p必须是一个new表达式动态分配的结果,或者是个空指针。当scoped_ptr对象的生命期结束时,析构函数~scoped_ptr()会使用delete操作符自动销毁所保存的指针对象,从而正确地回收资源。
scoped_ptr同时把拷贝构造函数和赋值操作符都声明为私有的,禁止对智能指针的复制操作,保证了被它管理的指针不能被转让所有权。
scoped_ptr示例代码:
#include <boost/smart_ptr.hpp>
#include <iostream>
using namespace boost;
using namespace std;
struct posix_file
{
posix_file(const char * file_name)
{
cout << "open file:" << file_name << endl;
}
~posix_file()
{
cout << "close file" << endl;
}
};
int main()
{
scoped_ptr<posix_file> p(new posix_file("/tmp/a.txt"));
return 0;
}
scoped_ptr与auto_ptr的根本性区别在于指针的所有权。auto_ptr特意被设计为指针的所有权是可转移的,可以在函数之间传递,同一时刻只能有一个auto_ptr管理指针。而scoped_ptr把拷贝构造函数和赋值函数都声明为私有的,拒绝了指针所有权的转让——除了scoped_ptr自己,其他任何人都无权访问被管理的指针,从而保证了指针的绝对安全。
auto_ptr<int> ap(new int(10));
scoped_ptr<int> sp(ap);//ok
auto_ptr<int> ap2;
ap2=ap;//ok
scoped_ptr<int> sp2;
sp2=sp;//not ok!编译报错!
scoped_ptr不支持比较操作,不能在两个scoped_ptr之间,或者在scoped_ptr和原始指针或空指针之间进行相等或者不相等测试,我们也无法为它编写额外的比较函数,因为它已经将operator == 和operator !=两个操作符重载都声明为私有的。但scoped_ptr提供了一个可以在bool语境中自动转换为bool值(如if的条件表达式)的功能,用来测试scoped_ptr是否支持一个有效的指针(非空)。它可以代替与空指针的比较操作。