new运算符和delete运算符

运算符new看似是一个简单的运算,比如:

int *pi=new int(5);

但是它实际由两个步骤完成:

1.通过适当的new运算符函数实体,配置所需的内存:

//调用函数库中的new运算符
int *pi=__new(sizeof(int));

2.给配置得到的对象分配初值:

*pi=5;

(注意,上面的代码中并不包括 exception handling,是为了方便理解,实际上应该进行检测)

new运算符实际上总是以标准的C malloc()函数来完成的,虽然并没有规定非要这么做不可。相同的情况,delete运算符也总是以标准的C free()来完成的。

extern void
operator delete(void*ptr)

if(ptr)
free((char*)ptr);

placement operator new 语意

有一个预先设定好的overloaded的new运算符,称为placement operator new。它需要第二个参数,类型为void*,调用方式如下:

Point2d *pt=new(area)Point2d;

其中area指向内存中一个区域块,用以放置新的point2d对象,这个预先设定好的placement operator new 的实现方法非常简单,只要获得上面传递的void*指针所给出的地址(在获取该地址的时候,要先将类型强转为char*类型)。

Point2d *pt=(Point2d*)area;
if(pt!=0)
pt->Point2d::Point2d();

这正是使用placement operator new的威力强大之处,这一份代码将决定object被放置在哪里,编译器保证object的constructor会施行在这个地址上。

但是有一个缺点:如果该地址上面已经有一个object,而且这个对象有destructor,这个destructor并不会被调用,调用该destructor的唯一方法就是将那个指针delete掉。

delete pt;
pt=new(area)Point2d;

delete会发挥作用,但是它也会释放该内存,这不是我所想要看到的,因为下一个指令我们就要调用pt,因此我们应该明确的调用destructor,并且保留空间。

pt->~Point2d;
pt=new(area)Point2d;

后续的部分和第七章template语意学我准备先暂留着,过段时间重头再读一遍这本书。

《深度探索C++对象模型》第六章 执行期语意学的更多相关文章

  1. 《深度探索C++对象模型》第二章 | 构造函数语意学

    默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一 ...

  2. 【C++对象模型】第六章 执行期语意学

    执行期语意学,即在程序执行时,编译器产生额外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行. 1.对象的构造和析构 对于类对象的构造,一般在定义之后则开始内部的构造过程 ...

  3. 深度探索C++对象模型读书笔记-第六章执行期语意学

    在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置.对于函数中的局部对象,会将析构函数安插在对象的每一个离开点. 例如: 1: void Function(int a) { 2 ...

  4. 深度探索C++对象模型之第一章:关于对象之对象的差异

    一.三种程序设计范式: C++程序设计模型支持三种程序设计范式(programming paradiams). 程序模型(procedural model) char boy[] = "cc ...

  5. Android深度探索-卷1第六章心得体会

    这章主要介绍了第一个linux驱动程序:统计单词个数.Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,都保存在/dev目录中.大多数Linux驱动都有与其对应的设备文件,因 ...

  6. 深度探索C++对象模型之第一章:关于对象之C++对象模型

    一.C和C++对比: C语言的Point3d: 数据成员定义在结构体之内,存在一组各个以功能为导向的函数中,共同处理外部的数据. typedef struct point3d { float x; f ...

  7. 深度探索C++对象模型之第二章:构造函数语意学之Copy constructor的构造操作

    C++ Standard将copy constructor分为trivial 和nontrivial两种:只有nontrivial的实例才会被合成于程序之中.决定一个copy constructor是 ...

  8. 深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作

    C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的 ...

  9. 《深度探索C++对象模型》第一章 | 关于对象

    C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外.静态和非静态的成员函数也被放置在所有类对象之外.每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中.每个类对 ...

  10. 深度探索C++对象模型第四章:函数语义学

    C++有三种类型的成员函数:static/nonstatic/virtual 一.成员的各种调用方式 C with class 只支持非静态成员函数(Nonstatic member function ...

随机推荐

  1. Linux基础_6_文本编辑

    vi i #编辑 ESC+:wq #保存退出 ESC+ZZ #保存退出 ESC+:q! #不保存退出 shift+z+q #不保存退出 dd #删除所在行 ESC+u #撤销dd误操作 :/字符串 # ...

  2. 通过齐博fun函数实现调用每周赚取的积分排行使用

    下面代码保存到fun函数目录即可 <?php namespace app\common\fun; use think\db; class Jfrank { /** * @param string ...

  3. flutter系列之:flutter中可以建索引的栈布局IndexedStack

    目录 简介 IndexedStack简介 IndexedStack的使用 总结 简介 之前我们介绍了一个flutter的栈结构的layout组件叫做Stack,通过Stack我们可以将一些widget ...

  4. Educational Codeforces Round 122 (Rated for Div. 2)/codeforces1633

    CodeForces1633 Div. 7 解析: 题目大意 给定 \(t\) 组数据.每组数据给定一个数 \(n\)(\(10\le n\le 999\)). 每次操作可以修改 \(n\) 任意一位 ...

  5. 【SSM】学习笔记(二)——SpringMVC入门

    原视频链接:https://www.bilibili.com/video/BV1Fi4y1S7ix/?p=43&spm_id_from=pageDriver&vd_source=8ae ...

  6. C# Linq 查询汇总

    分组取值.求和.计数 1 var resultlist = orderllist.GroupBy(oo => new { oo.Deptname, oo.Userid, oo.Username ...

  7. JavaScript Array对象的splice方法 数组的添加和删除

    Splice方法  :拼接 splice() 方法用于添加或删除数组中的元素. var index = Array.indexOf(value);    //可以匹配value在Array中的索引,匹 ...

  8. Oracle数据库PLSQL编程和存储过程

    一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...

  9. 五、Python操作redis

    五.Python操作redis 一.python对redis基本操作 (1)连接redis # 方式1 import redis r = redis.Redis(host='127.0.0.1', p ...

  10. VirtualBox 下 CentOS7 静态 IP 的配置 → 多次踩坑总结,蚌埠住了!

    开心一刻 一个消化不良的病人向医生抱怨:我近来很不正常,吃什么拉什么,吃黄瓜拉黄瓜,吃西瓜拉西瓜,怎样才能恢复正常呢? 医生沉默片刻:那你只能吃屎了 环境准备 VirtualBox 6.1 网络连接方 ...