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函 ...
随机推荐
- 发布完ArcGIS地图服务后,服务未启动成功
今天下午更新地图服务后,服务未启动成功.出来的弹出框警告问题目前应该是ArcGIS Server出了问题,打开ArcCatalog目录,查看GIS服务器下localhost下的服务,只要是今天发布的服 ...
- ASP.NET MVC 5改进了基于过滤器的身份验证
ASP.NET MVC 5包含在最近发布的Visual Studio 2013开发者预览版中,它使开发人员可以应用身份验证过滤器,它们提供了使用各种第三方供应商或自定义的身份验证提供程序进行用户身份验 ...
- Redis与Java - 数据结构
Redis与Java 标签 : Java与NoSQL Redis(REmote DIctionary Server) is an open source (BSD licensed), in-memo ...
- HDU----(2157)How many ways??(快速矩阵幂)
How many ways?? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 关于java中JButton的样式设置(的一些我们应该知道的函数)(转)
1. 对JButton大小的设置 ——因为JButen是属于小器件类型的,所以一般的setSize不能对其惊醒大小的设置,所以一般我们用 button.setPreferredSize(new Dim ...
- 127. 126. Word Ladder *HARD* -- 单词每次变一个字母转换成另一个单词
127. Given two words (beginWord and endWord), and a dictionary's word list, find the length of short ...
- 弹出消息对话框ScriptManager
//直接调用WebMessageBox方法 #region 弹出消息对话框 /// <summary> /// 弹出消息对话框 /// </summary> /// <p ...
- SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束
创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...
- 【转载】FLUNT温度场模拟
1. Gambit 绘制几何计算域,划分网格,定义边界类型 2. fluent设置以及计算 注意: define->models->energy 打开能量方程 de ...
- js ——算法
1.使用js 数组去重复: 方法①: var arr=[1,2,1,5,2,3,5,1,6,9]; function deRepeat(){ var newArray=[]; var obj={}; ...