//条款13:以对象管理资源
// 1.C++程序中最常使用的资源就是动态分配内存,并且还包括文件描述器,互斥锁,GDI对象、数据库连接、网络socket等。不管哪一种资源,当不再使用的时候必须将其归还给系统。
// 2.诸如以下代码:
void fun(int *p)
{
...
...
delete p;
}//以上代码中,p是指向动态分配的内存,在此函数中对p进行使用和释放,但是在函数中可能有一个过早的return语句导致delete语句不能被执行,或者产生一个异常而导致delete语句不能被执行
// 3.当然,谨慎的编写程序可以避免上述错误,但是必须考虑到,代码可能在时间渐渐过去后被修改,一旦软件开始接受维护,可能会被添加欠缺考虑的return等语句而导致delete不能被正常执行
// 4.为了确保上述函数中指针p所指的对象能被正确释放,正确的做法可以是将指针p放入一个对象内,该对象的析构函数会自动释放那些资源。
// 5.利用智能指针可以方便的实现利用对象来管理动态内存资源。经过测试,由于智能指针析构复杂,当需要考虑效率的时候,不如将资源放入一个简单的自定义类中进行管理。
// 6.对于其他资源,可以建立一个资源类,在析构函数中进行资源的释放。 //条款14:在资源类中小心复制行为(利用另一个对象初始化或者用其赋值)
// 1.禁止复制。如同类unique_ptr那样,比如一个资源类包含了互斥锁,那么这个类就应该禁止复制。通过将一系列的拷贝操作声明为private并且不进行定义来实现禁止复制。
// 2.引用计数法。如同类shared_ptr那样,将一直有资源,直到它的最后一个使用者被销毁。实际上使用shared_ptr类并传入自己的删除器可以很方便的实现对资源进行引用计数法管理。
// 3.复制底部资源。有时候需要针对一份资源,需要拥有其任意数量的副本,此时进行对资源的深拷贝。
// 4.转移底部资源。将资源从一个拥有者转移给另一个拥有者。即移动的概念。当对unique_ptr进行std::move的时候就是这种情况。 //条款15:在资源类中提供对原始资源的直接访问
// 1.存在很多函数需要访问原始资源,所以每个资源类都应该提供对原始资源直接访问的方法
// 2.智能指针对->和*进行了重载,它们允许隐式转换至底部原始指针。
unique_ptr<string> pStr(new string("szn"));
int size = pStr->size(); //size = 3
// 3.智能指针的get()成员函数也可以直接获取智能指针所管理的原始资源。 //条款16:成对使用new和delete时要采取相同的形式。
// 1.使用new[]分配内存的时候,会有多个构造函数被调用,当不慎使用delete删除new[]分配的内存时,对应的析构函数的调用次数会出错。
// 2.当使用typedef的时候特别要小心 //17.以独立的语句将new出来的对象放入智能指针中
// 1.考虑如下语句:
fun(shared_ptr<int>(new int), fun1());
// 由于函数形参的调用时机不同,上述函数的调用方式可能是这样的:首先执行new int,然后执行fun1(),最后执行shared_ptr的构造函数,当在fun1()中产生异常,则将导致内存泄露。
// 2.避免上述问题的方法很简单:
shared_ptr<int> pInt(new int);
fun(pInt, fun1());   

  

Effective C++ 3.资源管理的更多相关文章

  1. 《Effective C++》资源管理:条款13-条款17

    条款13:以对象管理资源 为了防止资源泄漏,请使用RAII(Resource Acquisition Is Initialization)对象,在构造函数里面获得资源,在析构函数里面释放资源 auto ...

  2. 【Effective C++】资源管理

    资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向 ...

  3. Effective C++: 03资源管理

    所谓资源,就是一旦用了它,将来必须还给系统.C++中的资源有:内存.文件描述符.互斥锁.数据库连接.网络socket等. 13:以对象管理资源 1:像下面这个函数: void f() { Invest ...

  4. effective c++:资源管理

    对象管理资源 createInvestment 函数作用时创建一个invest对象: void f() { Investment *pInv = createInvestment(); // call ...

  5. Effective C++(15) 在资源管理类中提供对原始资源的访问

      问题聚焦:     资源管理类是为了对抗资源泄露.     如果一些函数需要访问原始资源,资源管理类应该怎么做呢?        关于资源管理的概念总是显得那么的高大上,其实只是抽象一点. 下面用 ...

  6. Effective C++(14) 在资源管理类中小心copying行为

    问题聚焦:     上一条款所告诉我们的智能指针,只适合与在堆中的资源,而并非所有资源都是在堆中的.     这时候,我们可能需要建立自己的资源管理类,那么建立自己的资源管理类时,需要注意什么呢?. ...

  7. 《Effective C++》第3章 资源管理(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  8. 《Effective C++》第3章 资源管理(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  9. Effective C++笔记:资源管理

    资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向 ...

随机推荐

  1. [转]漫谈数据中心CLOS网络架构

    http://djt.qq.com/article/view/238 1.数据中心网络架构挑战 随着技术的发展,数据中心的规模越来越大,一个数据中心的服务器容量从几年前的几千台服务器发展到今天的几万甚 ...

  2. SQL搜索下划线,like中不能匹配下划线的问题

    最近在检测天气预报15天查询网 站(http://tqybw.net)时的URL时,发现页面中有很些404页,分析发现,是请求地址的能参数中多了下划线“_”,而rewrite规 则中并没有配这样的规则 ...

  3. quanpailie quanbianli

    #include<stdio.h>char data[5]={'a','b','c','d','e'};int vist[5]={0};char step[5]={0};char bu[5 ...

  4. 【转】C# HttpWebRequest\HttpWebResponse\WebClient发送请求解析json数据

    http://blog.csdn.net/kingcruel/article/details/44036871 版权声明:本文为博主原创文章,未经博主允许不得转载. ================= ...

  5. XML xsd

    targetNamespace:表示本XSD中定义的元素和类型的名字空间都是http://exammpleOrder. xmlns:xsd:表示以前缀xsd开头的元素或则类型来自于http://www ...

  6. php 通过exec 创建git分支失败

    今天给我们自己的发布系统增加一个新建分支的功能,操作比较简单,但是使用php执行shell命令的时候总是无法push分支到远程,但是登陆服务器执行却是可以的 新建分支命令如下 git fetch -- ...

  7. php---实现保留小数点后两位

    PHP 中的 round() 函数可以实现 round() 函数对浮点数进行四舍五入. round(x,prec) 参数说明x 可选.规定要舍入的数字.prec 可选.规定小数点后的位数. 返回将 x ...

  8. Delphi调用约定

    Register Calling Convention Ojbect Pascal的默认调用约定为register,寄存器调用约定会将前三个参数依次放入eax,edx,ecx,返回值是eax(根据类型 ...

  9. [Stanford 2011] Ordinary Calculator(By myself)

    说明: 前面的RPN计算器是按照stanford课程做的,是后缀表达式的计算.现在这个计算器是自己做的.这个是一般的计算器,即中缀表达式的计算,而且把计算过程也显示在屏幕上, 设计方法: 在Model ...

  10. php实现斐波那契数列以及由此引起的联想

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...