以对象管理资源

通过对象的析构函数的自动调用来自动释放资源

第一部分:几种典型的以对象管理资源的例子

1. STL::auto_ptr

获取资源后立刻放入资源管理对象

  1. std::auto_ptr<Investment> pInv(createInvestment());

当pInv生命周期结束时,自动释放资源

注意:auto_ptr有一个奇怪的性质:不会有多个auto_ptr同时指向同一个资源。

  1. std::auto_ptr<Investment> pInv2(pInv);
  2. // pInv2 指向对象,pInv设为null
  3.  
  4. pInv = pInv2;
  5. //pInv指向对象,pInv2为null

auto_ptr在复制或者赋值时,转移底部资源的所有权

2. RCSP(引用计数型智能指针)

持续追踪共有多少个对象指向某一资源,并在无人指向它时自动释放资源。。类似于Java的垃圾回收机制。

e.g. TR1::shared_ptr

下面是一个简单的Reference counting的智能指针

  1. // copyright @ L.J.SHOU Dec.23, 2013
  2. // class for managing pointer, smart pointer class
  3. #ifndef HAS_PTR_H_
  4. #define HAS_PTR_H_
  5. #include <iostream>
  6.  
  7. class HasPtr;
  8. class U_Ptr
  9. {
  10. friend class HasPtr;
  11. int *ip;
  12. size_t use;
  13. U_Ptr(int *p): ip(p), use(1) { }
  14. ~U_Ptr() { delete ip; }
  15. };
  16.  
  17. class HasPtr
  18. {
  19. public:
  20. HasPtr(int *p, int i) : ptr(new U_Ptr(p)), val(i) {}
  21. // copy members and increment the use count
  22. HasPtr(const HasPtr &rhs):
  23. ptr(rhs.ptr), val(rhs.val) { ++ ptr->use; }
  24. HasPtr& operator=(const HasPtr &rhs);
  25. // if use count goes to zero, delete the U_Ptr object
  26. ~HasPtr() { if(--ptr->use == 0) delete ptr; }
  27.  
  28. int *get_ptr() const { return ptr->ip; }
  29. int get_int() const { return val; }
  30.  
  31. void set_ptr(int *p) { ptr->ip = p; }
  32. void set_int(int i) { val = i; }
  33.  
  34. int get_ptr_val() const { return *ptr->ip; }
  35. int set_ptr_val(int i) { *ptr->ip = i; }
  36. private:
  37. U_Ptr * ptr; // pointer to use-counted U_Ptr class
  38. int val;
  39. };
  40.  
  41. // increment rhs's use count first to avoid self assignment
  42. HasPtr& HasPtr::operator=(const HasPtr &rhs)
  43. {
  44. ++ rhs.ptr->use; // increment use count on rhs first
  45. if(--ptr->use == 0)
  46. delete ptr; // if use count goes to zero, delete object
  47. ptr = rhs.ptr;
  48. val = rhs.val;
  49. return *this;
  50. }
  51.  
  52. #endif

第二部分:如何处理资源管理对象的复制操作

C++中,通过类的copy constructor 和 copy assignment来控制资源对象的复制。

通常有以下四种策略:

1. 禁止复制:将copy constructor 和copy assignment声明为private, 并不给予实现

2. 引用计数法:赋值时,资源的“被引用数”增加1。例如shared_ptr

3. 复制底部资源:每个对象拥有各自的资源,不能实现资源共享

4. 转移底部资源的拥有权:e.g. std::auto_ptr

Effective C++ ----以对象管理资源的更多相关文章

  1. [Effective C++ --013]以对象管理资源

    这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...

  2. 《Effective C++》学习笔记条款13 以对象管理资源

    条款 13 :以对象管理资源 例:      voidf()      {           Investment *pInv = createInvestment();           ... ...

  3. Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

    三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...

  4. effective C++ 读书笔记 条款14 以对象管理资源

    如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...

  5. 以对象管理资源——C++智能指针auto_ptr简介

    auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...

  6. Effective C++(13) 用对象管理资源

    问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基 ...

  7. EC笔记:第三部分:13、以对象管理资源

    C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc ...

  8. Effective C++ -----条款13:以对象管理资源

    为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...

  9. C++以对象管理资源

    先看下面一段代码: class Node {}; Node* CreateNode() { } void Solve() { Node *p=CreateNode(); //调用CreateNode函 ...

随机推荐

  1. 笔记7:winfrom的一些知识点(一)

    一.MDI窗体 private void 添加窗体ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 frm1 = new Form ...

  2. css解决方案经验杂记

    文本垂直居中 单行文本:line-height的值等于height: 多行文本:padding上下值一致即可: 还可以使用position:absolute进行绝对定位,如果是相对父级元素,则需要设置 ...

  3. JS比较好用的一些方法搜集

    JS比较好用的一些方法搜集 Math.ceil(x) -- 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 Math.floor(x)--返回小于等于数字参数的最大整数,对数字进行下舍入 ...

  4. node 事件循环

    什么是事件循环 Node只运行在一个单一线程上,至少从Node.js开发者的角度是这样的.在底层, Node是通过libuv来实现多线程的. Libuv库负责Node API的执行.它将不同的任务分配 ...

  5. JDicom使用指南

    适用条件本指南用于使用JDicom进行环境模拟.产品调试. 一.安装JDicom运行JDicom安装程序之前,需安装JRE 1.3及以上版本.否则,弹出如下图所示报错 安装JRE 1.4:双击运行可执 ...

  6. 手动实现ArrayList

    public interface List { public void insert(int i,Object obj)throws Exception; public void delete(int ...

  7. 转:mysql 创建一个用户,指定一个数据库

    转自:http://blog.sina.com.cn/s/blog_8c2525390101h0dv.html mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 h ...

  8. NetworkComms框架介绍 完美支持TCP/UDP协议

    NetworkComms网络通信框架序言 英文文章地址 :http://www.networkcomms.net/tcp-udp-connections/ NetworkComs.Net无缝的支持TC ...

  9. C#语法小用法

    数据在存为数据库之前,用JS的encodeURIComponent进行编码,现需要在后台代码中进行解码,实现decodeURIComponent的功能, 如下: HttpUtility.UrlDeco ...

  10. javaWeb开发总结 ---- 前端数据插入到后台

    一,概述: 本文主要描述如何将数据通过表单提交到后台并插入到数据库.其中后台使用spring框架. 二,开发流程: 明确需求,即将什么数据插入到数据库 平台搭建,配置spring, 数据库,建表 走通 ...