首页 > 代码库 > boost库学习之 scoped_ptr scoped_array

boost库学习之 scoped_ptr scoped_array

boost.smart_ptr库提供了六种智能指针:scoped_ptr、scoped_array、shared_ptr、shared_array、week_ptr和intrusive_ptr。
说到智能指针,我们会想到c++98标准中的自动指针auto_ptr.
auto_ptr获取指针所有权后,离开作用域时自动释放该指针指向的堆内存。也可以转移指针的所有权。
auto_ptr<A> ap_a1(new A);
auto_ptr<A> ap_a2(ap_a1); //发生所有权转移,此时ap_a1不再管理申请的A对象
	
if (ap_a1.get() == nullptr)
	cout << "ap_a1.get() == nullptr" << endl; //输出ap_a1.get() == nullptr

if (ap_a2.get() == nullptr)
	cout << "ap_a2.get() == nullptr" << endl; 


scoped_ptr是一个很类似auto_ptr的智能指针。但scoped_ptr的所有权不能转让。
scoped_ptr把拷贝构造函数和赋值操作符声明为私有,重载了*和->操作符,因此可以把scoped_ptr当作指针一样使用。
需要包含<boost/scoped_ptr.hpp>头文件,引用boost命名空间
void func()
{
	scoped_ptr<A> sp_a1(new A);
	sp_a1->print();		    //支持普通指针的*、->操作符
	sp_a1.get()->print();       //成员函数get返回持有的指针
	sp_a1.reset(new A);         //reset不再持有之前的指针,删除指针,并持有新指针,会调用A类的析构函数
	sp_a1++;		    //错误,未定义递增操作符
	scoped_ptr<A> sp_a2(sp_a1); //错误,不支持指针所有权转移
}


不需要delete操作,scoped_ptr会自动帮我们释放资源,所以如果在之前对指针delete,scoped_ptr析构时再对指针delete可能会发生未定义行为。
scoped_ptr不会向auto_ptr一样转移指针所有权,会减少错误的发生,没有多余的操作,保证了与原始指针同样的效率,代码也更清晰。
scoped_array
scoped_array类似scoped_ptr,接口和功能几乎是与scoped_ptr相同,弥补了标准库中没有指向数组的智能指针的缺憾。
速度与原始数组几乎一样快,但不支持动态增长数组。不支持迭代器,不能搭配STL算法。
注意:
1.scoped_array接受的指针必须是new[]的结果,不能是new表达式的结果
2.scoped_array没有重载*、 ->操作符
3.重载了[]操作符,可以向普通数组用下标访问。
scoped_array<int> sa(new int[100]);  //包装动态数组
sa[0] = 10;                          //正确,重载了[]
*(sa + 1) = 20;                      //错误, 没有重载*

{
    scoped_array<int> sa(new int[100]);
}                                     //退出作用域自动释放数组资源


boost库学习之 scoped_ptr scoped_array