//条款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. Ruby--Array

    --后面连接其它数组:[ARRAY].concat([OTHER ARRAY]) --排序:sort,进阶:sort_by{|obj| obj.[VALUE]} --随机获取:[ARRAY].samp ...

  2. 灰度图像 Grayscale Binary_image

    https://en.wikipedia.org/wiki/Grayscale https://zh.wikipedia.org/wiki/灰度图像 In photography and comput ...

  3. mysql ERROR 1045 (28000): Access denied for user解决方法 (转)

    问题重现(以下讨论范围仅限Windows环境): C:\AppServ\MySQL> mysql -u root -pEnter password:ERROR 1045 (28000): Acc ...

  4. spark之combineByKey

    combineByKey def combineByKey[C](createCombiner: (V) => C, mergeValue: (C, V) => C, mergeCombi ...

  5. qTip2 精致的jQuery提示信息插件

    qTip2 精致的jQuery提示信息插件    出处:http://www.cnblogs.com/lwme/archive/2012/02/16/qtip2-jquery-plugin.html ...

  6. sql CRUD 增删改查复习汇总

    1.创建数据库create database 数据库名称删除数据库drop database 数据库名称2.创建表create table 表名(    列名 类型(长度) 自增长 主键 非空,)自增 ...

  7. mysql参数,蛮全的

    网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...

  8. Android笔记:真机调试

    参考:android通过USB使用真机调试程序 手机:华为Y511-U00 1.将手机USB调试模式连接到PC(直接用数据线连接到PC一般可以自动切换) 2.连接成功后提示安装驱动,我选择的是自动安装 ...

  9. (letcode)String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  10. JSONModel 遇见关键字为id或者description

    像id.description这样的,都是系统自带的,要解析它,得特殊处理一下.我用的是JSONModel { "contentList": [ { "id": ...