智能指针 shared_array

来源:互联网 发布:博雅大数据学院 编辑:程序博客网 时间:2024/05/15 05:41

shared_array
 shared_array类似shared_ptr,它包装了new[]操作符在堆上分配的动态数组,同样使用引用计数机制为动态数组提供了一个代理,可以在程序的生命周期里长期存在,直到没有任何引用后才释放内存。
 shared_array的接口与功能几乎是与shared_ptr是相同的,主要区别如下:
 【1】构造函数接受的指针p必须是new[]的结果,而不能使new表达式的结果;
 【2】提供operator[]操作符重载,可以像普通数组一样用下标访问元素;
 【3】没有 *,->操作符重载,因为shared_array持有的不是一个普通指针;
 【4】析构函数使用的delete[]释放资源,而不是delete;
用法:
 shared_array就像shared_ptr和scoped_array的结合体--即具有shared_ptr的优点,也具有scoped_array的缺点。有关shared_ptr和scoped_array的讨论大都适合它.
例子:
#include <boost/smart_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace boost;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 int *p = new int[100];//一个动态数组
 shared_array<int> sa(p);//shared_array代理动态数组
 shared_array<int> saEx = sa;//共享数组,引用计数增加
 sa[0] = 10;
 assert(saEx[0] == 10);
 return 0;
}

注意:
 在使用shared_array重载的operator[]时要小心,shared_array不提供数组索引的范围检查,如果使用了超过动态数组大小的索引或者是负数索引将引发可怕的未定义行为。
 shared_array能力有限,多数情况下它可以用shared_ptr<std::vector>或者std::vector<shared_ptr>来代替,这两个方案具有更好的安全性和更多的灵活性,而所付出的代价几乎可以忽略不计.