智能指针scoped_ptr

scoped_ptr的所有权更加严格,不允许转让,对其赋值和拷贝都是不合法行为,因而显得更轻巧和快捷。

scoped_ptr重载了operator*()和operator->()解引用操作符*和箭头操作符->,因此可以把scoped_ptr对象如同指针一样使用。如果scoped_ptr保存的空指针,那么这两个操作的行为未定义。

scoped_ptr不能在两个scoped_ptr之间、scoped_ptr与原始指针之间或空指针之间进行了相等或不相等测试。operator ==和operator !=都被声明为私有。

scoped_ptr明确地表明了代码原始者的意图:只能在定义的作用域内使用,不可转让。

boost::scoped_ptr有着更严格的使用限制——不能拷贝。这就意味着:boost::scoped_ptr指针是不能转换其所有权的。

    1. 不能转换所有权
      boost::scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法传到区间之外,这就意味着boost::scoped_ptr对象是不能作为函数的返回值的(std::auto_ptr可以)。
    2. 不能共享所有权
      这点和std::auto_ptr类似。这个特点一方面使得该指针简单易用。另一方面也造成了功能的薄弱——不能用于stl的容器中。
    3. 不能用于管理数组对象
      由于boost::scoped_ptr是通过delete来删除所管理对象的,而数组对象必须通过deletep[]来删除,因此boost::scoped_ptr是不能管理数组对象的,如果要管理数组对象需要使用boost::scoped_array类。


      成员函数


      功能


      operator*()


      以引用的形式访问所管理的对象的成员


      operator->()


      以指针的形式访问所管理的对象的成员


      reset()


      释放所管理的对象,管理另外一个对象


      swap(scoped_ptr& b)


      交换两个boost::scoped_ptr管理的对象

  1. template<class T> class scoped_ptr // noncopyable
  2. {
  3. private:
  4. T * px;
  5. scoped_ptr(scoped_ptr const &);
  6. scoped_ptr & operator=(scoped_ptr const &);
  7. typedef scoped_ptr<T> this_type;
  8. void operator==( scoped_ptr const& ) const;
  9. void operator!=( scoped_ptr const& ) const;
  10. public:
  11. typedef T element_type;
  12. explicit scoped_ptr( T * p = 0 ); // never throws
  13. explicit scoped_ptr( std::auto_ptr<T> p ); // never throws
  14. ~scoped_ptr() // never throws在其作用域结束时自动删除保存的指针对象,从而正确地回收资源
  15. void reset(T * p = 0) // never throws删除原来保存的指针,再保存新的指针p,如果p是空指针,那scoped_ptr将不持有任何指针
  16. {
  17. BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
  18. this_type(p).swap(*this);
  19. }
  20. T & operator*() const // never throws
  21. {
  22. BOOST_ASSERT( px != 0 );
  23. return *px;
  24. }
  25. T * operator->() const // never throws
  26. {
  27. BOOST_ASSERT( px != 0 );
  28. return px;
  29. }
  30. T * get() const // never throws返回scoped_ptr内部保存的原始指针
  31. {
  32. return px;
  33. }
  34. void swap(scoped_ptr & b);// never throws交换两个scoped_ptr保存的原始指针
  35. };
时间: 2024-08-01 11:04:31

智能指针scoped_ptr的相关文章

Boost智能指针——scoped_ptr

boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: 1 #include <string> 2 #include <iostream> 3 #include <boost/scoped_ptr.hpp> 4 5 class implementation 6 { 7 public: 8 ~implementation() { std::cout <<&

[转] Boost智能指针——scoped_ptr

http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <string>#include <iostream>#include <boost/scoped_ptr.hpp> class implementation{

【C++深入浅出】智能指针之auto_ptr学习

起:  C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template<class _Ty> class auto_ptr { // wrap an object pointer to ensure destruction public: //定义_Myt类型,作用域局限于类中,便于书写和理解 typedef auto_ptr<_Ty> _Myt; typ

Boost之智能指针的类别比较

Boost智能指针--scoped_ptr boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <string> #include <iostream> #include <boost/scoped_ptr.hpp> class implementation { public:     ~implementation() { std::c

【C++】 浅析智能指针

引言: 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 所谓智能指针就是智能/自动化的管

boost 智能指针的使用

最近在学习Boost的智能指针,下面对一些很好的文章进行整理如下: Boost智能指针——scoped_ptr http://www.cnblogs.com/TianFang/archive/2008/09/15/1291050.html Boost智能指针——shared_ptr http://www.cnblogs.com/TianFang/archive/2008/09/19/1294521.html Boost智能指针——weak_ptr http://www.cnblogs.com/T

【C++】智能指针详解(三):scoped_ptr

在介绍scoped_ptr之前,我们先回顾一下前两篇文章的内容. 首先,智能指针采用RAII机制,通过对象来管理指针,构造对象时,完成资源的初始化;析构对象时,对资源进行清理及汕尾. auto_ptr,通过转移管理权来完成对象的拷贝与赋值,在实际开发中并不实用. 回顾完智能指针的背景及auto_ptr的特性之后,本文来介绍scoped_ptr的实现原理及特性. scoped_ptr与auto_ptr类似,但最大的区别就是它不能转让管理权.也就是说,scoped_ptr禁止用户进行拷贝与赋值. 诶

智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr

RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 智能指针:用自动化或者说智能的指针来实现对动态内存的释放.它是一个类,有类似指针的功能. 常见的智能指针:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,由于scoped_array和scoped_

智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr

RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放. STL--auto_ptr Boost库的智能指针(ps:新的C++11标准中已经引入了unique_ptr/shared_ptr/weak_ptr) 常见的智能指针有:auto_ptr/scoped