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函 ...
随机推荐
- mysql查询优化(持续更新中)
1. 索引不会包含有NULL值的列 (1) 应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描 (2) 数据库设计时不要让字段的默认值 ...
- getsockname和getpeername
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen); // 获取与某个套接字关联的本地协议地址 i ...
- java设计之简单的JAVA计算器
做这个东西主要是为了练习一下以前学习过的java Swing,所以那些复杂的算法就没有加载到里面去........ 先展示一下效果....,额,当然不是这个样子.... ---> 代码: p ...
- 超实用的JavaScript代码段 --倒计时效果
现今团购网.电商网.门户网等,常使用时间记录重要的时刻,如时间显示.倒计时差.限时抢购等,本文分析不同倒计时效果的计算思路及方法,掌握日期对象Date,获取时间的方法,计算时差的方法,实现不同的倒时计 ...
- VS输入输出基本操作以及数据类型和类型转换
(一) C#项目的组成结构 项目结构 .config ---配置文件(存放配置参数文件) .csproj ---项目文件(管理文件项) .sln ---解决方案文件(管理项目) .cs - ...
- Android WebView的使用
WebView是View的一个子类,使用它可以在App中嵌入H5页面,可以跟js互相调用. webview有两个方法:setWebChromeClient和setWebClient setWebCli ...
- java版复利计算
这是我修改为java的初定界面,还有很多细节问题还没有解决,希望老师可以给我多点的点评,接下来继续努力,我会把每一次的进步发上来,不断的去锻炼. 1.我所用的开发工具是ecipse 2.所有的语言为j ...
- 0302IT行业就业&软件工程之我所思和所想
阅读以下文章 http://www.thea.cn/news/terminal/9/9389.html http://www.shzhidao.cn/system/2015/09/22/0102610 ...
- js计算日期的前几天的日期
月份0---11 var date = new Date(year,fenye_arr[0]-1,fenye_arr[1]); miao=date.getTime(); var ...
- Ibatis.Net 各种配置说明(二)
一.各个配置文件的作用说明 providers.config:指定数据库提供者,.Net版本等信息. xxxxx.xml:映射规则. SqlMap.config:大部分配置一般都在这里,如数据库连接等 ...