《深度探索C++对象模型》第六章 执行期语意学
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++对象模型》第六章 执行期语意学的更多相关文章
- 《深度探索C++对象模型》第二章 | 构造函数语意学
默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一 ...
- 【C++对象模型】第六章 执行期语意学
执行期语意学,即在程序执行时,编译器产生额外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行. 1.对象的构造和析构 对于类对象的构造,一般在定义之后则开始内部的构造过程 ...
- 深度探索C++对象模型读书笔记-第六章执行期语意学
在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置.对于函数中的局部对象,会将析构函数安插在对象的每一个离开点. 例如: 1: void Function(int a) { 2 ...
- 深度探索C++对象模型之第一章:关于对象之对象的差异
一.三种程序设计范式: C++程序设计模型支持三种程序设计范式(programming paradiams). 程序模型(procedural model) char boy[] = "cc ...
- Android深度探索-卷1第六章心得体会
这章主要介绍了第一个linux驱动程序:统计单词个数.Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,都保存在/dev目录中.大多数Linux驱动都有与其对应的设备文件,因 ...
- 深度探索C++对象模型之第一章:关于对象之C++对象模型
一.C和C++对比: C语言的Point3d: 数据成员定义在结构体之内,存在一组各个以功能为导向的函数中,共同处理外部的数据. typedef struct point3d { float x; f ...
- 深度探索C++对象模型之第二章:构造函数语意学之Copy constructor的构造操作
C++ Standard将copy constructor分为trivial 和nontrivial两种:只有nontrivial的实例才会被合成于程序之中.决定一个copy constructor是 ...
- 深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作
C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的 ...
- 《深度探索C++对象模型》第一章 | 关于对象
C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外.静态和非静态的成员函数也被放置在所有类对象之外.每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中.每个类对 ...
- 深度探索C++对象模型第四章:函数语义学
C++有三种类型的成员函数:static/nonstatic/virtual 一.成员的各种调用方式 C with class 只支持非静态成员函数(Nonstatic member function ...
随机推荐
- PHP + ELK实现日志记录
一个简单的PHP 文件 效果 full.conf文件 流程: 开启logstash服务之后. 在业务代码里面操作函数写入日志.log logstash通过实践戳获取到用户的变更,取出最后一行数据,发送 ...
- 2022年最新最详细的tomcat安装教程和常见问的解决
文章目录 1.官网直接下载 1.1.jdk的版本和tomcat版本应该相对应或者兼容 1.2. 在官网找对应的tomcat版本进行下载 1.3 .根据电脑版本下载64-bit windows zip( ...
- 12.-ORM-条件查询&查询谓词
一.条件查询 filter(条件) 语法:MyModel.objects.filter(属性1=值1,属性2=值2) 作用:返回包含次条件的全部数据集 返回值:QuerySet容器对象,内部存放MyM ...
- DevOps | 如何快速提升团队软件开发成熟度,快速提升研发效能?
今天一个小伙伴问我,如何「快速提升」一个团队的软件开发成熟度?我犯难了.我个人理解一个团队的软件开发成熟度涉及的东西很多,但最简单最直接的方法就是发钱涨工资,可是估计很多公司不愿意,那就只有扣了. 快 ...
- Istio(五):使用服务网格Istio进行流量路由
目录 一.模块概览 二.系统环境 三.简单路由 3.1 简单路由 四.Subset和DestinationRule 4.1 Subset 和 DestinationRule 4.2 Destinati ...
- Java中math类的常用函数
Java中math类的常用函数 在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数.对数.平方根和三角函数等 只要在源文件的顶部加上下面这行代码就不必在数学方法名和常量名 ...
- while循环条件不成立却无法跳出死循环的问题
在进入循环的时候,实际上是将A从内存加载到寄存器里面运行的,在整个循环中,A这个变量都只是在读取寄存器里面的值. 而当进入中断的时候,中断里面会从内存加载A到寄存器,修改完之后又存到内存里,然后退出中 ...
- Hexo多台电脑同步
如果换了电脑该如何同步Hexo的源文件?把hexo文件从一个电脑cope到另外一个电脑吗?答案肯定不是这样的,因为这里面有好多依赖包,好几万个文件呢,这样显然不合理. 本文提供一种多台电脑同步源文件的 ...
- Educational Codeforces Round 130 (Rated for Div. 2) C. awoo's Favorite Problem
https://codeforc.es/contest/1697/problem/C 因为规则中,两种字符串变换都与'b'有关,所以我们根据b的位置来进行考虑: 先去掉所有的'b',如果两字符串不相等 ...
- SQL server 操作相关
1.更改列的顺序后进行保存. 在SQL Server Management Studio中, "工具"--"选项"--"Designers" ...