1、类中没有指针,如果对象构造过程中出现异常,C++保证已经构造好的那一部分自动销毁。注意:这里不是调用析构方法,而是编译器在你的构造方法中插入了一些代码,保证对已经构造好的对象析构。

2、类中有指针,比如有a, b两个指针。对象构造时,a初始化完成,b抛出异常,C++只会对已经构造好的对象析构,而不会对已经初始化好的指针执行delete。因此资源泄漏。

3、注意,这种情况下,绝不会调用析构方法,因为C++只会析构已经构造完成的对象。接着思考,在堆上分配对象,把指针传出来,对指针delete,可行吗?

  不可行,因为构造过程出现异常,指针是传递不出来的。外部的指针还是null。

4、思考:为什么C++只析构已经构造完成的对象?

  假如析构部分构造的对象,那么析构方法该做些什么事呢?应该是析构已经构造好的那一部分,但是这要求记录哪些内容已经构造好,哪些内容没有构造好,显然,这个代价太大,因此不执行。

5、怎么解决上面的问题呢?

  对指针的初始化过程,使用try...catch。但是这里有个问题,对于const指针(不是指向const对象的指针),必须在初始化列表中进行初始化,没办法使用try...catch。该怎么办? 建立成员方法,返回指针。

6、第一条我们就提到,对象构造过程中,如果出现异常,C++会对已经构造好的对象进行析构,但是不会对已经初始化好的指针进行delete。C++如何做到这一点,编译器在构造方法中插入了一些代码。因此,更好的解决办法是:不使用原始指针,而是使用智能指针,智能指针本质上就是:栈上的对象来管理资源。在这种情况下,类中没有原始指针,只有智能指针,对象构造过程出现异常,C++对已经构造好的对象进行析构,包括智能指针,进而释放资源。

【M10】在构造方法内阻止资源泄漏相关推荐

  1. windows 内存泄露和资源泄漏调试

    AQTime (有x64.win32的)进行内存泄露和资源泄漏监控 http://wenku.baidu.com/view/9aa1c2afdd3383c4bb4cd2c1.html x64下载:ht ...

  2. 11.6 如何使用内嵌资源类(ResourceRetriever)?

    获取类库(组件 或 装配件)的内嵌资源,一般返回的是字节流或文件流,在获取时还应该指定从哪个类库获取,如果未指定类库时,则类库是发起调用方法所在的类库. 所在组件:IBeamMDAACore.dll ...

  3. GDI对象和CDC的使用方法(防止资源泄漏)

    1:CDC方面:        CDC有三种使用方式        一种是获得,包括GETDC和GETWINDOWDC,这种CDC是引用,使用完了一定要ReleaseDC,不释放就会这个引用过来的CD ...

  4. 单例模式引发的内存泄漏:_资源泄漏:救援的命令模式

    单例模式引发的内存泄漏: 多年来, 使用Plumbr进行性能监控时,我遇到了数百个资源泄漏引起的性能问题. 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题. 首先,我以电影播放器​​应用 ...

  5. 资源泄漏:救援的命令模式

    多年来, 使用Plumbr进行性能监视时,我遇到了数百个资源泄漏引起的性能问题. 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题. 首先,我以电影播放器​​应用程序为例来描述问题. 这种 ...

  6. 构造方法内的多态问题

    例:A extends B 如果A类中有一方法f(),且B类中也有方法f(),则方法f()就有多态,如果在A类的构造方法中调用f()方法,在new B() 创建B 对象的时候,在调用B的构造方法之前, ...

  7. 资源组 —— 助你轻松解决单账户内的资源分组管理难题

    最近,阿里云ResourceManager服务新增了"资源组管理"功能,以帮助客户解决企业内部多用户.多项目的资源分级管理难题.使用资源组管理,您可以对单个云账号下多个地域.多种资 ...

  8. vs2015c语言内嵌汇编,C#中内嵌资源的读取

    起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...

  9. 内嵌资源html,go 1.16 embed 实现资源文件(html, css, js等)内嵌

    Golang 发布1.16,如今通过//go:embed 注解内嵌资源文件并打包到二进制文件,关于//go:embed的使用网上很多教程,我想也不需要我在此在啰嗦一遍,今天的重点:用go开发网站时候内 ...

最新文章

  1. HDU1425简单排序题
  2. Modelsim仿真查看内部信号
  3. 分布式查询的使用准则
  4. python求pai的近似值_Python实现蒙特卡洛模拟(第1部分)【个人翻译自Medium】
  5. 继续Bargaining
  6. js面向对象-组合使用构造函数模式和原型模式(使用最广泛、认同度最高)
  7. 普通类创建获取session 方式_猿蜕变11——一文搞懂mybatis花式使用方式
  8. [设计模式-结构型]桥接(Bridge )
  9. Nginx配置https和wss
  10. unity, itween 对不透明对象使用FadeTo需要先更换material
  11. Unix/Linux环境C编程入门教程(24) MySQL 5.7.4 for Red Hat Enterprise 7(RHEL7)的安装
  12. win10系统自动安装应用商店(Microsoft Store)方法步骤
  13. Entity Component System与Entity Component
  14. 车机软件测试ADBShell命令集合
  15. Git连接GitHub仓库,同步上传图片及CSDN外链图片转存失败解决方案
  16. ubuntu 16.04 镜像下载(国内开源镜像站)
  17. 企业创新系列之:天地不仁
  18. Oracle数据库综合试题
  19. 数列极差问题(c语言实现)
  20. OCR到底哪家强?清描:一款多功能图文识别工具

热门文章

  1. php中怎么判断输入密码与原密码一致_「每周FPGA案例」电子密码锁设计
  2. 支持哪些格式的图标_免费矢量图标素材资源网站,您一定会有需要(建议收藏)...
  3. feign整合sential_Sentinel 和 Feign 集成时,方法名称写错
  4. linux系统安装klocwork,linux下klocwork的使用
  5. 年假计算器在线_死亡计算器 和 年龄计算器
  6. Java之StringUtils的常用方法(非常不错)
  7. java基本类型有缓冲区类型的有_Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类...
  8. 华为鸿蒙mate,华为MatePad Pro发布亮相!华为首款鸿蒙平板全新体验!
  9. python输入的字符串转换为对应的数字类型_第1期 | psychopy:数据类型及运算符
  10. php 过滤所有html,php过滤所有html标签_PHP教程