1、Widget* pw = new Widget; 调用了两个方法:第一个方法是operator new 负责分配内存;第二个方法是在分配的内存上构造Widget,即调用Widget的default构造方法。

2、那么问题来了,如果operator new分配内存成功,而Widget构造抛出异常,这种情况下,pw还没有赋值,这不就导致资源泄露了?

  不会造成资源泄露,因为C++运行系统保证调用delete释放资源。

3、正常的operator new 如下:

  void* operator new(std::size_t) throw (std::bad_alloc);

  正常的operator delete如下:

  void operator delete (void* rawMemory) throw(); // global作用域中的正常签名式

  void operator delete (void* rawMemory,std::size_t size) throw (); //class 作用域中典型的签名式

  除了上面的operator new,还有重载operator new,这些重载的new称为placement new,其中有一个比较特殊的,如下:

  void* operator new (std::size_t, void* pMemory) throw ();

  当我们使用new在堆上申请内存时,编译器尝试找到一块内存。而上面的placement new是说,不要去找内存了,直接分配在pMemory上。

4、现在问题来了,存在多个重载的operator new,当我们调用一个重载的new,出现上面的情况,即构造Widget出现异常,运行时该调用哪个delete呢?

  做法是:调用一个与operator new 对应的operator delete,如果没有这样的delete,那么运行时系统什么也不做。这就必然导致资源泄漏。因此,为了避免这种情况下,用户必须保证operator new 存在与它对应的operator delete。

5、上面delete的调用,是说,使用operator new,构造对象时出现异常,运行期系统调用与之对应的operator delete。正常情况下,delete pw调用正常的delete。

6、为了避免漏掉相关的delete,可以建立一个父类,其它类继承,共享这些方法。需要注意的是,继承会导致掩盖同名称的成员,因此需要在子类中使用using XXX。

转载于:https://www.cnblogs.com/nzbbody/p/3532805.html

【52】写了placement new也要写placement delete相关推荐

  1. 深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

    大家好,我是微学AI,今天给大家带来手写OCR识别的项目.手写的文稿在日常生活中较为常见,比如笔记.会议记录,合同签名.手写书信等,手写体的文字到处都有,所以针对手写体识别也是有较大的需求.目前手写体 ...

  2. 用python写跑酷游戏脚本,用Python写一个天天酷跑

    感觉上次写的植物大战僵尸与俄罗斯方块的反应还不错,这次这个文章就更有动力了 这次就写一个天天酷跑吧 写出来的效果图就是这样了 下面就更新一下全部的代码吧 还是老样子先定义`import pygame, ...

  3. 无盘服务器内存回写速度,解决无盘回写压力方法杂谈!

    无盘回写压力缓解,乱写的,不对的地方请跟贴! 那么从文章开始到现在,我们已经取得了很多非常有用的数据,那现在让我们来总结下根据这些数据我们都可以得出哪些结论: 在测试的一周中,所有客户机平均每天的回写 ...

  4. 先写API文档还是先写代码?你需要这款神器Apifox!

    代码未动,文档先行 其实大家都知道 API 文档先行的重要性,但是在实践过程中往往会遇到很多困难. 程序员最讨厌的两件事:1. 写文档,2. 别人不写文档.大多数开发人员不愿意写 API 文档的原因是 ...

  5. 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才

    遇到不会写的字怎么办? 估计每个人都会遇到这样的情况,特别是小学生,认字不全,遇到不会写的字是常有的事情. 就是不知道大家遇到这样的问题的时候是怎么解决的,记得读书的时候,老师一般会告诉我们不会写的字 ...

  6. 过程 oracle 写在哪里,Oracle怎么写存储过程? 在什么地方写以及怎么调用?最好给个Sample 急(2)...

    当前位置:我的异常网» Java Web开发 » Oracle怎么写存储过程? 在什么地方写以及怎么调用 Oracle怎么写存储过程? 在什么地方写以及怎么调用?最好给个Sample 急(2) www ...

  7. 代写SOFTENG 370 Operating Systems课设、代做C/C++ 留学生作业、代写c/c++代码、代写C/C++编程作业...

    代写SOFTENG 370 Operating Systems课设.代做C/C++ 留学生作业.代写c/c++代码.代写C/C++编程作业 SOFTENG 370 Operating Systems ...

  8. 自已动手写控件 --- 我第一次学习写自定义控件

    一直都是用系统的控件, 还从不知道一个控件该怎么去写~~~ 网上的教程太少了, 完全不知道怎么开头~~ 也一直用 RegisterClassEx + CreateWindowEx 创建一个主程序窗口, ...

  9. java方面的文献综述怎么写_文献综述应该怎么写?

    paperask免费论文查重 文献综述如果真的要进行划分的话,可以划分为两种写法,不同的写法也有着不同的作用.在这里简单来说几点. 第一种写法:论文绪论部分的文献综述. 我们知道,一篇过万字的论文,在 ...

  10. python写机器人程序_用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

最新文章

  1. Science | 智能计算揭示前生命化学网络中合成的连接、出现和自我再生
  2. git创建与合并分支
  3. 按类别组织的Python主要内置对象类型
  4. C++(八)——文件操作
  5. matlab gui设计实例_S-Funciton应用实例
  6. sap.ca.scfld.md.ComponentBase.extend
  7. 图解丨在嵌入式设备上实现HTTP服务器
  8. OSPF中的frame-relay(6) NBMA-broadcast
  9. 青苹果一键重装系统安装VS2015
  10. mysql show profiles 使用分析sql 性能
  11. 局域网IP扫描工具-OpUtils
  12. js使用高德地图api实现定位,行政区域划分,点击事件,只显示某个省市或区,海量点标记
  13. python语言实例-Python代码样例列表
  14. 华硕笔记本返厂维修流程_笔记本不能更换显卡为何又叫独立显卡?
  15. Java模拟醉汉行走问题_醉汉随机行走/随机漫步问题(Random Walk Drunk Python)
  16. java 判断邮箱_java使用正则表达式判断邮箱格式是否正确的方法
  17. 《“笨办法” 学C语言(Learn C The Hard Way)》
  18. PMBOK(第六版) PMP笔记——《七》第七章(项目成本管理)
  19. UDP协议全面实验分析详解
  20. 如何用计算机给闺蜜表白,闺蜜情话最暖心短句50句

热门文章

  1. C++基于多态实现依赖颠倒原则附源码
  2. C/C++实现读取当前文件夹下的文件-popen
  3. 安装并配置ssh服务器
  4. SpringBoot代码复用——thymeleaf提取导航栏并插入或替换元素
  5. Tomcat设置虚拟目录的方法, 不修改server.xm
  6. setup.s 解读——Linux-0.11 剖析笔记(三)
  7. python:使用PyInstaller打包成exe文件,以及TypeError: an integer is required (got type bytes)异常解决
  8. Spring TX源码分析
  9. Mysql主从复制(docker例子)
  10. 何为消息队列,为何使用消息队列,有什么消息队列插件