<布局new操作符——不负责分配内存>

布局new操作符能够使我们在分配内存时指定位置。

如下代码交代了相关语法:

  char *buffer = new char[BUF];

  JustTesting *p1, *p2;

   p1 = new (buffer) JustTesting;  //额外加入的(buffer)用来指定位置

这意味着将JustTesting的一个实例分配在了以buffer为头地址的内存空间中,并用指针p1指向这个实例。

换句话说,我们将JustTesting实例化在了已经被开辟的内存空间buffer中。

  这时候我们不禁要问一句,我们在同一个位置开辟了两次内存空间,这合理吗?

  并且在相关代码即将结束时,我们需用如下代码析构对象并释放内存。

    pc->~JustTesting();

    delete[]buffer;

  对应的,如果析构函数的作用是释放内存空间,我们对同一内存空间释放了两次,这又合理吗?

  一个合理的猜测是内存空间可被重叠分配和释放,只要使用的合理,不存在越界等问题,就是合乎语法的。

  但是问题远没我们猜测的这么复杂。

  首先需要说明的是,布局new操作符是一个不折不扣的骗子。它的责任仅仅在指定的内存空间(buffer)实例化出一个JustTesting的对象而已,并不负责分配内存。也就是说,我们在使用布局new操作符的时候,必须保证指定的地址是安全的。这正是{Char *buffer = new char[BUF];}这行代码的作用。

<析构函数——不负责回收内存>

  其次,显示调用析构函数并不会起到释放内存的作用,它和普通的函数并无区别,仅仅将其中代码运行一遍而已。

  那为什么还要显示调用它呢?反正真正起到释放内存作用的是delete。释放之后这块内存又会被重新利用并覆盖。

  这一点都没错,但是当构造函数中有new操作符分配的额外内存时情况就不一样了。这将导致内存泄露。所以我们显示调用析构函数正是为了释放在构造函数中额外“借来”的内存。

  结论就是,构造函数和析构函数的调用并没有开辟或回收内存的作用。

<内存由谁分配?>

  那么我们使用如下代码时,确实分配了内存:

    JustTesting one;

  没错,或许你还能这样另一种确实分配了内存的情况:

    *p2 = new JustTesting;

  与之对应的就有:

    delete p2; //我们总是以这种方式去析构指针对象

  这下明白些了,在声明一个对象的时候隐含了new过程。对应地,删除对象的时候(例如超出作用域)也隐含了delete过程。(注意,new和布局new有着本质区别。)

<最后值的注意的一点>

  尽管构造和析构函数可以显示调用,但是当其中包含new和delete时,多次使用是危险的。它们会造成内存泄露和重复释放相同内存区。

转载于:https://www.cnblogs.com/sunrunner/p/3716134.html

布局new操作符引发的有关析构函数的探索与总结相关推荐

  1. C++中的布局new操作符

    C++中的布局new操作符 通常,new负责在堆内存中找到一个能够满足要求的内存块.new操作符还有一种变体:placement new 操作符,它能让你指定要使用的内存的位置. 程序员可以使用这种特 ...

  2. C++ Primer 笔记

    第二章 开始学习c++ 1 第三章 数据处理 1 3.1简单变量 1 3.2 const限定符 2 3.3浮点数 2 3.4 c++算术操作符 2 第四章  复合类型 2 4.1数组(array) 2 ...

  3. C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载

    C++--构造函数(拷贝构造,拷贝复制),析构函数,操作符重载 构造函数与析构函数:: 涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别 1.声明和定义构造函数和析构函数 构造函数在 ...

  4. placement new 操作符

    placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, pla ...

  5. BootStrap之前奏响应式布局

    BootStrap 简介 概念: 课程目标: 响应式布局技术 了解BootStrap前端框架 一.响应式布局 1.1 历史问题 回顾之前HTML+CSS的布局方式,都是使用像素(px)来布局网页的,可 ...

  6. OpenStack云撑起百联O2O战略布局

    电子商务大潮来袭,传统零售行业也无不面临巨大的竞争压力,转型升级成为所有零售企业必须面对的问题,上海的百联集团也不例外.百联集团堪称线下零售业航母,旗下有40多家大型综合百货购物中心,4400余家超商 ...

  7. 全自动模拟布局设计的挑战和机遇

    摘要 实现模拟/混合信号 (AMS) 集成电路 (IC) 的布局是一项复杂的任务,因为它具有高度的设计灵活性和敏感的电路性能. 与数字 IC 版图自动化的进步相比,模拟 IC 版图设计仍然是大量人工操 ...

  8. 巴比特 | 元宇宙每日必读:如何依托自身资源参与布局元宇宙?这个“九宫格”框架了解一下...

    摘要:将元宇宙分为偏硬和偏软两个维度分别结合分析.硬件维度可以分为三个基础设施:算力.通信/存储和光学显示.而软件维度的三个层次:数据.算法.激励来层层递进解读,这就构成了元宇宙的九宫格框架.分别是: ...

  9. 探秘元宇宙 || 布局元宇宙新赛道,″头号玩家″蓝海创意云这样做!

    ​​自2021年起,元宇宙相关概念受到全球资本市场热捧,大批企业纷纷布局元宇宙市场.当前,元宇宙正以新理念.新业态.新模式与多行业发展完美结合,逐渐成为重组全球要素资源.重塑全球产业结构.改变全球产业 ...

最新文章

  1. 替换功能replaceAll
  2. 实用的人工智能 但数据 Python 速查表
  3. COM笔记-CoCreateInstance
  4. 过程改进建设中的常见奖励措施
  5. NOI模拟题4 Problem C: 填格子(board)
  6. post php数据,php post数据
  7. python去除图片上的文字_Python图像处理之识别图像中的文字(实例讲解)
  8. Git--版本管理的使用及理解
  9. PyCharm编辑器的安装
  10. 人生苦短之---第一个Python程序
  11. ADT-bundle(Android Development Tools)环境配置
  12. 解决:android源码同步repo sync 时出现的fatal:duplicate path错误
  13. python实战代码目录信息
  14. python pyquery 解析html数据
  15. 外国科学家有哪些黑历史? - 易智编译EaseEditing
  16. select标签 selected 选中状态动态查询
  17. 计算机科学和交互设计,交互设计(超越人机交互原书第5版)/计算机科学丛书
  18. 中国工程院院士评选结果公布,阿里王坚当选
  19. 常见问题汇总:FLUENT面数据处理
  20. SAT作文-- 一篇优秀作文范例

热门文章

  1. json接收与发送(转自csdnblog)
  2. C++中XML的读写操作(生成XML 解析XML)
  3. 【09】Nginx:静态压缩 / 日志切割 / 防盗链 /恶意解析/ 跨域
  4. 3-2 :eq(index)过滤选择器
  5. 用插件的形式编写升级版 jquery_select_interval.js 源码
  6. java将数据流解析为字符串
  7. jQuery初识 - jQuery中的方法
  8. [HTTP] HTTP协议基础及发展历史
  9. 基于CSS3实现元素宽度向两侧延伸
  10. mvc中去除html标签,MVC ValidationMessage 去除上面的Html 标签