C++中资源泄漏一直都是老大难的问题,特别是在嵌入式环境中,一点点的资源泄漏,加上长时间的运行们就会导致程序崩溃,这种问题定位非常困难,无规律偶发。解决问题的一种方式是使用特定工具检查内存泄漏,优点是简单,可以直接找出泄漏的函数,缺点是复现,时间长,不同工具的使用方式不同,不统一,在私有平台和编译器上可能无法使用。另一种解决方式是在开发时就对所有的资源进行管理,从根本上解决资源泄漏的问题,本章主要说明资源管理的方法。

以对象管理资源

  • 提供专门的类对某一资源进行管理,不在手动的对资源进行释放

  • 方法:在资源管理类的析构函数中对管理的资源进行释放,当管理类被析构时,会自动释放资源

  • 难点:

    • 同一资源被多个管理类管理

    • 多线程中,资源死锁的问题

    • 常用的资源管理类:auto_ptr share_ptr

  • https://www.cnblogs.com/chusiyong/p/11295230.html

std::auto_ptr<Investment> p(creatInvestment());

在资源管理类中小心copy行为

  • 原因:防止同一资源被多个管理类管理,从而导致多次释放的问题

  • 方法:

    • 进行深拷贝

    • 抑制管理类的拷贝动作

    • 使用应用计数(注意死锁问题)

在资源管理类中提供对原始资源的访问

  • 资源管理类需要提供访问原始资源的方法,可以是显示的也可以是隐式的

  • 一般而言显示的获取资源比隐式的安全,建议使用显示方式

  • 优点:使用资源管理类和使用普通指针的方法相同,具备一致性

  • 方法:重载->操作符

成对的使用new和delete

  • delete和new成对使用

  • delete [] 和 new[]成对使用

  • new会调用构造函数,delete会调用析构函数

  • free和malloc成对使用

以独立语句将newed对象置入智能指针

int f1()
void f2(std::tr1::shared_ptr<Widget> pw, int x) f2(new Widget, f1()) //错误,tr1::shared_ptr需要一个原始指针,且构造函数是explict,无法隐式转换 f2(std::tr1::shared_ptr<Widget>(new Widget), f1()) //ok,但不安全
// 1.执行new Widget 2.调用shared_ptr<Widget>构造函数 3.调用f1() 但是三者顺序不确定(1一定在2之前) std::tr1::shared_ptr<Widget> pw(new Widget)
f2(pw, f1()) //ok,且安全

高效C++:资源管理的更多相关文章

  1. PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)

    100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...

  2. 初探百度F.I.S — 由工具到解决方案

    1. 前言 阅兵放假三天,我哪儿也没去,宅着看了一些东东:git命令行.svn命令以及下面的主角——百度FIS.对看过的git.svn的命令也做了一些总结,请参见:<git命令学习笔记>和 ...

  3. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q4-Q5)

    Question 4 You are designing a SharePoint 2010 application to store 50 GB of digital assets, includi ...

  4. PayPal 高级工程总监:读完这 100 篇文献,就能成大数据高手

    原文地址 开源(Open Source)对大数据影响,有二:一方面,在大数据技术变革之路上,开源在众人之力和众人之智推动下,摧枯拉朽,吐故纳新,扮演着非常重要的推动作用:另一方面,开源也给大数据技术构 ...

  5. 转: 通过不到100行Go代码打造你自己的容器

    备注:这个文章讲容器,讲的比较的浅显易懂.推荐,前期入行者看. 转: http://www.infoq.com/cn/articles/build-a-container-golang?utm_sou ...

  6. [转帖]Kubernetes及容器编排的总体介绍【译】

    Kubernetes及容器编排的总体介绍[译] 翻译自The New Stack<Kubernetes 生态环境>作者:JANAKIRAM MSV和 KRISHNAN SUBRAMANIA ...

  7. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

  8. Security+学习笔记

    第二章 风险分析 风险管理 评估:确定并评估系统中存在的风险 分析:分析风险对系统产生的潜在影响 响应:规划如何响应风险的策略 缓解: 缓解风险对未来安全造成的不良影响 风险分析流程 资产确定 漏洞确 ...

  9. SuperEdge 易学易用系列-SuperEdge 简介

    关于 SuperEdge SuperEdge 是由腾讯.Intel.VMware.虎牙直播.寒武纪.首都在线和美团等多家公司共同发起的边缘容器管理系统,它基于原生 Kubernetes.针对边缘计算和 ...

随机推荐

  1. vue通过属性绑定为元素设置class样式

    第一种方式,直接传递一个数组,注意使用v-bind绑定             <h1 :class="['red','size'">这是一个h1文本</h1&g ...

  2. java android 序列号serializable和parcelable

    why 为什么要了解序列化?—— 进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递. ...

  3. 【故障公告】阿里云 RDS 实例 CPU 100% 故障引发全站无法正常访问

    非常抱歉,今天凌晨 3:20~8:30 左右,我们使用的阿里云 RDS 实例 SQL Server 2016 标准版突然出现 CPU 100% 故障,造成全站无法正常访问,由此给您带来巨大的麻烦,请您 ...

  4. 为什么 char c = 'A';c += 32; 结果输出的是 'a'?

    首先 char 类型的数据只要参与运行会先转换为 int 类型数值(在 ASCII 编码表中 'A' 对应十进制的 65),那么 'A' 转换为 int 为 65,65 + 32 = 97,+= 包含 ...

  5. Android Studio 插件 ADBWifi 无线调试真机

    长话短说,步骤如下 Android Studio 安装插件 ADB Wifi.这一步可以选择AS->Settings->Plugins->Market搜索:或者可以选择去插件官网下载 ...

  6. Elasticsearch从入门到放弃:分词器初印象

    Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来 ...

  7. python用类的方式创建线程---自创建类

    用类的方式创建线程---自创建类 import threadingimport time class MyThread(threading.Thread):#自建MyThread类继承threadin ...

  8. Web前端MVC框架的意义分析

    前言: Web前端开发是Web技术发展中的一个重要组成部分,在传统的前端开发中由于外界因素的影响导致其开发形式呈现出简单化的特点,即以页面为主体来展示界面中的信息.然而随着科学技术的不断进步,Web前 ...

  9. 「STL中的常用函数 容器」

    占个坑,下午在更 二分操作:lower_bound和upper_bound 存图/数列操作:vector容器 全排列:next_permutation和prev_permutation 字符串转数列: ...

  10. P4408 逃学的小孩 题解

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心 ...