Effective C++(13) 用对象管理资源
从这条准则开始,都是关于资源管理的。
资源,一旦用了它,将来必须还给系统。
本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基础上。
Demo: root class Investment:
class Investment { ... };
// 工厂函数
Investment* createInvestment(); // 返回指向一个Investment或者其子类的对象,调用者有责任删除它 // 考虑如下调用
void f()
{
Investment* pInv = createInvestment();
......
delete pInv; // 释放pInv所指的对象
}
问题:
当在delete语句调用之前出现return语句或者抛出异常并且该异常被默默地忽略掉时,这个对象便无法被释放。
解决思路:
C++的析构函数自动调用机制
方案一:类指针对象
标准程序库提供的 auto_ptr 是个“类指针对象”,也就是所谓的智能指针,其析构函数自动对所指对象调用delete。
void f()
{
std::auto_ptr<Investment> pInv(createInvestment(( ));
......
}
获得资源后立刻放进管理对象:资源取得时机便是初始化时机管理对象运用析构函数确保资源被释放:一旦对象被销毁(例如当对象离开作用域),其析构函数自然会被自动调用,于是资源被释放。
为了防止多个auto_ptr同时指向同一对象,auto_ptr有一个不同寻常的性质:若通过拷贝构造函数或重载赋值操作符复制它们,原指针会变成null,而复制所得的指针将取得资源的唯一拥有权。
void f()
{
std::auto_ptr<Investment> pInv(createInvestment(( ));
......
}
void f()
{
...
std::str1::shared_ptr<Investment> pInv(createInvestment());
...
}
void f()
{
......
std::tr1::shared_ptr<Investment> pInv1(createInvestment());
std::str1::shared_ptr<Investment> pInv2(pInv1); // pInv1和pInv2指向同一对象
pInv1 = pInv2;
}
std::auto_ptr<std::string> aps(new std::string[10]);
std::str1::shared_ptr<int> spi(new int[1024]);
为了防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源两个常被使用的RAIIclasses分别是tr1::shared_ptr和auto_ptr,前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它指向Null。
Effective C++(13) 用对象管理资源的更多相关文章
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- [Effective C++ --013]以对象管理资源
这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- Effective C++ ----以对象管理资源
以对象管理资源 通过对象的析构函数的自动调用来自动释放资源 第一部分:几种典型的以对象管理资源的例子 1. STL::auto_ptr 获取资源后立刻放入资源管理对象 std::auto_ptr< ...
- effective C++ 读书笔记 条款14 以对象管理资源
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...
- 以对象管理资源——C++智能指针auto_ptr简介
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...
- EC笔记:第三部分:13、以对象管理资源
C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc ...
- Effective C++ -----条款13:以对象管理资源
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...
- 条款13:以对象管理资源(use objects to manage resources)
NOTE: 1.为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源. 2.两个常被使用的RAII classes 分别是 trl::shared_ptr 和 auto_ ...
随机推荐
- 【ORACLE】使用数据泵的生产环境impd,expdp数据迁移
********************************************** ** 原文: blog.csdn.net/clark_xu 徐长亮专栏 **************** ...
- Topshelf创建Windows服务
使用Topshelf创建Windows服务 概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps ...
- 栈 <stack>
STL: pop:完成的仅仅是移除最顶端的数据.如果访问最顶端的数据,需要使用top函数(这个操作通常也被称为peek). #include <stack> #include <cs ...
- javascript系列之this
原文:javascript系列之this 引言 在这篇文章里我们将会讨论与执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题是足够难的并且在不同的执行上下文中判定this的 ...
- 浅谈javascript中的call()和apply()方法
话说在js中,每个函数都包含两个非继承而来的放方法,apply()和call(),使得我们能在特定的作用域中调用函数. 官方定义: 语法: fun.call(thisArg[, arg1[ ...
- cocos2dx 3.0正式版 于mac在新建项目
下载cocos2dx 3.0正式版,和安装python2.7.*版本号. 加入cocos命令: mac下: 在cocos2d-x\tools\cocos2d-console\bin文件夹下.执行ins ...
- [转载]CSS元素的定位position
CSS元素的定位position 属性position 值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一 ...
- UVa 10533 - Digit Primes
题目:输出给定区间中,本身是素数,而且这个数的各位之和也是素数的数(称为位素数)的个数. 分析:数论.首先利用筛法,求出1000000内的全部的素数:然后在利用生成的素数表, 推断每一个数是不是各位之 ...
- Swift语言指南(二)--语言基础之注释和分号
原文:Swift语言指南(二)--语言基础之注释和分号 注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时会忽略注释. Swift的注释与C语言极其相似,单 ...
- Asp.net实现URL重写
原文:Asp.net实现URL重写 [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读 ...