概述
scoped_array很像scoped_ptr,它包装了new[ ]操作符(而scoped_ptr包装了new)在堆上分配的动态数组,为动态数组提供一个代理,保证可以正确地释放内存。
使得智能指针能指向数组了。scoped_array的特点如下:
1 构造函数接收的指针p必须是new[]的结果,而不能是new表达式的结果。
2 没有* ->操作符的重载,
3 析构函数采用delete [].而不是delete
4 提供operator[]操作符重载,可以像普通数组一样用下标访问元素。
int ar[10] 1 ar[0] 2 *ar ar[0] 3 *(ar+n)
5 没有begin end等类似容器的迭代器操作函数。
#include <iostream>
//#include<boost/smart_ptr.hpp>
///using namespace boost;
using namespace std;
/*
scoped_ptr 是局部智能指针 不允许转让所有权。
*/
template <class T>
class scoped_ptr
{
public:
explicit scoped_ptr(T *p = 0) :ptr(p) {}
//不允许显示类型转换
~scoped_ptr()
{
delete []ptr;
}
T &operator[](int index)// ar[3]
{
return ptr[index];
}
T& operator*()// *ar
{
return ptr[0];
}
T* operator+(int index) // *(ar+3)
{
return ptr+index;
}
void reset(T *p)//拥有权不允许转让 但是可以让智能指针指向另一个空间
{
if (p != ptr && ptr != 0)
delete ptr;
ptr = p;
}
private://将拷贝构造和赋值 以及判等判不等 都设置为私有方法
//对象不再能调用,即不能拷贝构造和赋值 也就达到了不让转移拥有权的目的
scoped_ptr(const scoped_ptr<T> &y);
scoped_ptr<T> operator=(const scoped_ptr<T> &);
void operator==(scoped_ptr<T> const &)const;
void operator !=(scoped_ptr<T> const &)const;
private:
T*ptr;
};
void main()
{
int *p = new int[10];
scoped_ptr<int> ps1(p);
for (int i = 0;i < 10;++i)
{
ps1[i] = i + 1;
}
for (int i = 0;i < 10;++i)
{
cout << ps1[i] << " ";
}
}
scoped_array的功能有限,不能动态增长 没有迭代器支持,不能搭配STL算法,仅有一个数组的接口.
尽量不使用scoped_array 而用vector
最后
以上就是听话便当为你收集整理的智能指针scoped_array 自己实现的全部内容,希望文章能够帮你解决智能指针scoped_array 自己实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复