boost::scoped_ptr 源码分析

一个作用域指针独占一个动态分配的对象。 对应的类名为    boost::scoped_ptr,它的定义在 boost/scoped_ptr.hpp 中。 不像    std::auto_ptr,一个作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。    一旦用一个地址来初始化,这个动态分配的对象将在析构阶段释放。

因为一个作用域指针只是简单保存和独占一个内存地址,所以 boost::scoped_ptr的实现就要比 std::auto_ptr 简单。 在不需要所有权传递的时候应该优先使用    boost::scoped_ptr 。 在这些情况下,比起    std::auto_ptr 它是一个更好的选择,因为可以避免不经意间的所有权传递。

我们通过下面的例子,可以了解scoped_ptr如何使用

#include <boost/scoped_ptr.hpp>
#include <iostream>

using namespace std;

int main()
{
    boost::scoped_ptr<int> i(new int);
    *i = 1;
    cout << "print the value by *i " << *i << endl;

    *i.get() = 2;
    cout << "print the value and assignment by get() " <<  *i.get() << endl;

    return 0;
}

 

===========The result is=====================

print the value by *i 1
print the value and assignment by get() 2

 

        一经初始化,智能指针 boost::scoped_ptr所包含的对象,可以通过类似于普通指针的接口来访问。 这是因为重载了相关的操作符    operator*()operator->()operator bool() 。 此外,还有    get()reset() 方法。    前者返回所含对象的地址,后者用一个新的对象来重新初始化智能指针。 在这种情况下,新创建的对象赋值之前会先自动释放所包含的对象。boost::scoped_ptr 的析构函数中使用    delete 操作符来释放所包含的对象。 这对    boost::scoped_ptr 所包含的类型加上了一条重要的限制。boost::scoped_ptr 不能用动态分配的数组来做初始化,因为这需要调用    delete[] 来释放。 在这种情况下,可以使用下面将要介绍的boost:scoped_array

       如果我们在操作中不小心把已有的scoped_ptr对象赋值给其他scoped_ptr, boost::scoped_ptr<int> ii(i)。程序会报错的:../boost_1_49_0/boost/smart_ptr/scoped_ptr.hpp:45:5: 错误:‘boost::scoped_ptr<T>::scoped_ptr(const boost::scoped_ptr<T>&) [with T = int, boost::scoped_ptr<T> =
 boost::scoped_ptr<int>]’是私有的。我们可以通过Scoped_ptr的源码来分析其中的理由:

class scoped_ptr
{
public:
  // Constructor.
  explicit scoped_ptr(T* p = 0)    //通过这里我们发现scoped_ptr是不允许在初始化这样使用scoped_ptr<int> i = new int 的。因为他们explicit的,是不能隐式转换的。
    : p_(p)
  {
  }

  // Destructor.
  ~scoped_ptr()
  {
    delete p_;    //调用的是delete,故不能指向数组
  }

  // Access.
  T* get()
  {
    return p_;
  }

  // Access.
  T* operator->()
  {
    return p_;
  }

  // Dereference.
  T& operator*()
  {
    return *p_;
  }

  // Reset pointer.
  void reset(T* p = 0)
  {
    delete p_;
    p_ = p;
  }

private:
  // Disallow copying and assignment.       所有权不能传递的秘密在着呢。
  scoped_ptr(const scoped_ptr&);
  scoped_ptr& operator=(const scoped_ptr&);

  T* p_;
};

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值