1、scoped_array
是专门对数组空间进行管理的。包装了new[]在堆上分配的动态数组;
scoped_array弥补了标准库中没有指向数组的智能指针的缺憾。
2、此类特点如下:
(1)、构造函数接受的指针p必须是new[]的结果,不能是new;
(2)、没有*、->操作符的重载(库中不提供这些的重载,但是我们可以自己写),因为scoped_array所持有的不是一个普通的指针;
(3)、析构则必须用delete [];
(4)、提供operator[]的重载,可以像普通数组一样进行下标访问元素;
(5)、没有begin()、end()等类似容器的迭代器操作函数;
scoped_array与scoped_ptr有相同的设计思想,也是局部智能指针,不能拷贝和赋值;
3、怎么使用scoped_array
#include<iostream> #include<boost/smart_ptr.hpp> //内部实现好的,直接调用系统的。 using namespace std; using namespace boost; //这个命名空间必须要有。 int main(void){ int *p = new int[10]; //申请数组空间 scoped_array<int> ps(p); //交与智能指针管理 for(int i = 0; i < 10; i++){ ps[i] = i+1; //可以进行下标操作 } for(i = 0; i < 10; i++){ cout<<ps[i]<<" "; } cout<<endl; } //拷贝构造和赋值都不可以。
4、scoped_array源码的实现
#include<iostream> using namespace std; template<class T> class scoped_array{ public: explicit scoped_array(T *p = 0) : px(p){} //预防隐式调用 ~scoped_array(){ delete []px; } public: typedef scoped_array<T> this_type; void reset(T *p = 0){ //重置方法 this_type.swap(*this);//无名临时对象 } void swap(scoped_array &b){ T *tmp = b.px; b.px = px; px = tmp; } T* get()const{ return px; } T& operator[](int i)const{ //下标越界没有检测 //return *(px+i); return px[i]; } T& operator*()const{ return px[0]; } T* operator+(int i)const{ return px+i; } private: T *px; scoped_array(scoped_array const &);//放到私有中,外界无法调用 scoped_array& operator=(scoped_array const &); void operator==(scoped_array const &)const; void operator!=(scoped_array const &)const; }; int main(void){ int *p = new int[10]; scoped_array<int> ps(p); *ps = 2; for(int i = 0; i < 10; i++){ ps[i] = i+1; } *(ps + 3) = 100; //利用 + ,*的运算符的重载即可以实现。 for(i = 0; i < 10; i++){ cout<<ps[i]<<" "; } cout<<endl; }
库中没有提供*和+的重载。
scoped_array缺点:
不能动态增长,没有迭代器支持,不能搭配STL算法,是纯粹的裸接口,不推荐使用。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。