理解scope_ptr的内部实现

今天咱们来谈论scope_ptr(局部智能指针),咱们将与auto进行区别式进行阐述:函数

1.scope_ptr和auto_ptr相似,可以很是方便正确的删除建立的的对象。this

2.scope_ptr在获取对象所指空间的控制权后,是不能将本空间的控制权在交由他人管理。这是与auto_ptr的区别。spa

3.scope_ptr在操做上面,不能实现拷贝构造、=(赋值)、判断相等或者不等(咱们在这里实现这些,采用将这些函数写在类的私有属性中)。指针

4.最后咱们在详谈当中的reset函数和swap函数:code

typedef scope_ptr<int> this_type;
void
reset(T *p=0) { assert(p != 0 && p != px); this_type(p).swap(*this); } void swap(scope_ptr &b) { T *tmp = b.px; b.px = px; px = tmp; }

reset函数操做流程图以下:对象

1.this_type是咱们宏定义的一种类类型;this_type(p).swap(*this),传入参数p调用构造函数建立无名临时对象来调用swap函数;注意:无名临时对象出了做用于会自动释放所指向的空间,因此不会形成内存泄漏。blog

2.在调用swap函数后,this指针的指向会发生变化。注意图二内存

3.swap函数执行指针交换指向的操做。ci

 

scope_ptr实现代码以下:it

template<class T>
class scope_ptr { private: scope_ptr(scope_ptr const &); scope_ptr &operator=(scope_ptr const &); void operator==(scope_ptr const &)const; void operator!=(scope_ptr const &)const; public: explicit scope_ptr(T *p = 0) :px(p) {} //构造函数
    ~scope_ptr() { delete px; } public: void reset(T *p=0) { assert(p != 0 && p != px); this_type(p).swap(*this); } void swap(scope_ptr &b) { T *tmp = b.px; b.px = px; px = tmp; } T * operator->()const { assert(px != 0); return px; } T & operator*()const { assert(px != 0); return *px; } private: T *px; }; int main() { int *p = new int(10); scope_ptr<int> pa(p); cout << *pa << endl; return 0; }
相关文章
相关标签/搜索