Effective C++ ----以对象管理资源
以对象管理资源
通过对象的析构函数的自动调用来自动释放资源
第一部分:几种典型的以对象管理资源的例子
1. STL::auto_ptr
获取资源后立刻放入资源管理对象
- std::auto_ptr<Investment> pInv(createInvestment());
当pInv生命周期结束时,自动释放资源
注意:auto_ptr有一个奇怪的性质:不会有多个auto_ptr同时指向同一个资源。
- std::auto_ptr<Investment> pInv2(pInv);
- // pInv2 指向对象,pInv设为null
- pInv = pInv2;
- //pInv指向对象,pInv2为null
auto_ptr在复制或者赋值时,转移底部资源的所有权
2. RCSP(引用计数型智能指针)
持续追踪共有多少个对象指向某一资源,并在无人指向它时自动释放资源。。类似于Java的垃圾回收机制。
e.g. TR1::shared_ptr
下面是一个简单的Reference counting的智能指针
- // copyright @ L.J.SHOU Dec.23, 2013
- // class for managing pointer, smart pointer class
- #ifndef HAS_PTR_H_
- #define HAS_PTR_H_
- #include <iostream>
- class HasPtr;
- class U_Ptr
- {
- friend class HasPtr;
- int *ip;
- size_t use;
- U_Ptr(int *p): ip(p), use(1) { }
- ~U_Ptr() { delete ip; }
- };
- class HasPtr
- {
- public:
- HasPtr(int *p, int i) : ptr(new U_Ptr(p)), val(i) {}
- // copy members and increment the use count
- HasPtr(const HasPtr &rhs):
- ptr(rhs.ptr), val(rhs.val) { ++ ptr->use; }
- HasPtr& operator=(const HasPtr &rhs);
- // if use count goes to zero, delete the U_Ptr object
- ~HasPtr() { if(--ptr->use == 0) delete ptr; }
- int *get_ptr() const { return ptr->ip; }
- int get_int() const { return val; }
- void set_ptr(int *p) { ptr->ip = p; }
- void set_int(int i) { val = i; }
- int get_ptr_val() const { return *ptr->ip; }
- int set_ptr_val(int i) { *ptr->ip = i; }
- private:
- U_Ptr * ptr; // pointer to use-counted U_Ptr class
- int val;
- };
- // increment rhs's use count first to avoid self assignment
- HasPtr& HasPtr::operator=(const HasPtr &rhs)
- {
- ++ rhs.ptr->use; // increment use count on rhs first
- if(--ptr->use == 0)
- delete ptr; // if use count goes to zero, delete object
- ptr = rhs.ptr;
- val = rhs.val;
- return *this;
- }
- #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++ ----以对象管理资源的更多相关文章
- [Effective C++ --013]以对象管理资源
这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- effective C++ 读书笔记 条款14 以对象管理资源
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...
- 以对象管理资源——C++智能指针auto_ptr简介
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...
- Effective C++(13) 用对象管理资源
问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基 ...
- EC笔记:第三部分:13、以对象管理资源
C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc ...
- Effective C++ -----条款13:以对象管理资源
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...
- C++以对象管理资源
先看下面一段代码: class Node {}; Node* CreateNode() { } void Solve() { Node *p=CreateNode(); //调用CreateNode函 ...
随机推荐
- 笔记7:winfrom的一些知识点(一)
一.MDI窗体 private void 添加窗体ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 frm1 = new Form ...
- css解决方案经验杂记
文本垂直居中 单行文本:line-height的值等于height: 多行文本:padding上下值一致即可: 还可以使用position:absolute进行绝对定位,如果是相对父级元素,则需要设置 ...
- JS比较好用的一些方法搜集
JS比较好用的一些方法搜集 Math.ceil(x) -- 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 Math.floor(x)--返回小于等于数字参数的最大整数,对数字进行下舍入 ...
- node 事件循环
什么是事件循环 Node只运行在一个单一线程上,至少从Node.js开发者的角度是这样的.在底层, Node是通过libuv来实现多线程的. Libuv库负责Node API的执行.它将不同的任务分配 ...
- JDicom使用指南
适用条件本指南用于使用JDicom进行环境模拟.产品调试. 一.安装JDicom运行JDicom安装程序之前,需安装JRE 1.3及以上版本.否则,弹出如下图所示报错 安装JRE 1.4:双击运行可执 ...
- 手动实现ArrayList
public interface List { public void insert(int i,Object obj)throws Exception; public void delete(int ...
- 转:mysql 创建一个用户,指定一个数据库
转自:http://blog.sina.com.cn/s/blog_8c2525390101h0dv.html mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 h ...
- NetworkComms框架介绍 完美支持TCP/UDP协议
NetworkComms网络通信框架序言 英文文章地址 :http://www.networkcomms.net/tcp-udp-connections/ NetworkComs.Net无缝的支持TC ...
- C#语法小用法
数据在存为数据库之前,用JS的encodeURIComponent进行编码,现需要在后台代码中进行解码,实现decodeURIComponent的功能, 如下: HttpUtility.UrlDeco ...
- javaWeb开发总结 ---- 前端数据插入到后台
一,概述: 本文主要描述如何将数据通过表单提交到后台并插入到数据库.其中后台使用spring框架. 二,开发流程: 明确需求,即将什么数据插入到数据库 平台搭建,配置spring, 数据库,建表 走通 ...