对应C++11中的unique_ptr

#include <iostream>
#include <memory> class foo
{
public:
foo() { std::cout<<"constructor"<<std::endl;}
~foo() { std::cout<<"destructor"<<std::endl; } void doit() { std::cout<<"do"<<std::endl; }
}; int main()
{
std::unique_ptr<foo> sf(new foo);
sf->doit();
(*sf).doit(); sf.reset(new foo);
sf->doit(); return 0;
}

  

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. };

智能指针scoped_ptr的更多相关文章

  1. [转] Boost智能指针——scoped_ptr

    http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似, ...

  2. Boost智能指针——scoped_ptr

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: #include <string ...

  3. [4] 智能指针boost::scoped_ptr

    [1]boost::scoped_ptr简介 boost::scoped_ptr属于boost库,定义在namespace boost中,包含头文件#include <boost/scoped_ ...

  4. C++ 智能指针 boost::scoped_ptr分析

    1.scoped_ptr的实现原理及特性 特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值 实现原理:如何才能禁止 ...

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

    起:  C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template& ...

  6. c++ boost库学习二:内存管理->智能指针

    写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...

  7. 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  8. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  9. C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).

    目录 C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector). auto_ptr scoped_ptr ptr_vector C++智能指针,指针容器原 ...

随机推荐

  1. Palindrome Partitioning I & II

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  2. 学习mysql replication gitd

  3. plsql 查询 卡死问题解决

    plsql可以连接数据库,一点查询就卡死.sqlplus可以连接数据库,也可以查询.后经过测试,原来plsql所引用的路由器ip和服务器ip有限制,修改同一网段ip问题解决.但是不知为何不同网段ip可 ...

  4. Java基础88 数据库设计的三大范式

    数据库的设计原则:建议设计的表尽量遵守三大范式 1.第一范式 要求表的每个字段必须是不可分割的独立单元 Student表:    name       -- 违反了第一范式             张 ...

  5. javaScript对金额处理的方式

    例如 var price = $("#price").val(); 此时price 为字符串格式 假使我们想将其乘以100 可以选择 price*100将其转换为数值格式 但是有些 ...

  6. MySQL的架构模型

    看到大牛用户DB架构部的Keithlan<数据库性能优化之查询优化>,在学习过程发现很多不错的东西,就把它保存下来,分享给大家,因为作者说了一句很经典的话:“if you want to ...

  7. Swagger+IdentityServer4测试授权验证

    1.Bearer授权操作,添加如下代码 services.AddSwaggerGen(options => { options.AddSecurityDefinition("Beare ...

  8. 项目管理工具Maven的安装与使用

    一.Maven的简介 1. 什么是maven 是Apache下的一个开源的项目,是纯java编写,并且只是用来管理java项目. 2. Maven的好处 maven项目管理jar节省磁盘空间 一键构建 ...

  9. fullcalendar插件日程管理

    日程管理-fullcalendar插件用法   前言 本文分享fullcalendar用法,最后面提供代码下载 说到日程管理,基于JQuery的插件FullCalendar当之无愧,完整的API稳定和 ...

  10. NET MVC Bundling and RequireJS

    NET MVC Bundling and RequireJS   高手速来围观帮忙解惑~关于ASP.NET MVC Bundling and RequireJS的取舍问题,最近比较困惑,我希望有一种方 ...