Cpp 对象模型探索 / delete 运算符内部调用过程分析
一、delete 调用过程
1、测试代码,在 delete 处打下断点。
class CTest
{
public:CTest() {}~CTest() {}
};int main()
{CTest* pt1 = new CTest();delete pt1;return 0;
}
2、查看反汇编,代码如下:
之后再查看 operator delete 函数的 C++源码,如下所示:
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{#ifdef _DEBUG_free_dbg(block, _UNKNOWN_BLOCK);#elsefree(block);#endif
}
由代码可知,delete 操作本质上是调用了 free 函数,只不过针对是否是 Debug 模式而调用了不同版本的 free 函数。
流程图如下:
二、总结
1、delete 运算符的执行过程简述如下:
(1)获取需要释放的内存的地址。
(2)执行对象的析构函数(倘若有)。
(3)执行 operator delete 函数,里面执行 free 函数。
2、delete 和 operator delete 的关系。
(1)delete 是运算符,里面的执行的代码包括类的析构函数(若存在)和 operator delete 。
(2)operator delete 是函数,C++提供一个默认版本,里面包含了 free 函数。做为程序员,所能控制的是 operator delete 函数,可以对其进行重载,实现自己的内存释放函数。
(SAW:Game Over!)
Cpp 对象模型探索 / delete 运算符内部调用过程分析相关推荐
- Cpp 对象模型探索 / new 运算符内部调用过程分析
一.new 调用过程 1.测试代码 class CTest { public:CTest(){} };int main() {CTest *pt1 = new CTest();delete pt1;r ...
- Cpp 对象模型探索 / 虚函数的调用方式
虚函数有两种调用方式: 方案1,直接使用函数地址调用. 方案2,通过对象的虚函数表指针找到虚函数表,从而得到函数地址,完成调用. 应用场景主要有如下三种情况: 当对象直接调用时,采用方案 1 调用虚函 ...
- Cpp 对象模型探索 / 父类和子类调用构造函数和析构函数的顺序
2018-03-19 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 一.建立对象过程 father → son 栗子: class Parent {public:Parent ...
- Cpp 对象模型探索 / 系列文章的索引
一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...
- Cpp 对象模型探索 / operator new、operator delete、operator new[] 和 operator delete [] 重载
零.前言 对于函数 operator new 和 operator delete 来说,分为全局重载和局部重载. 全局重载的形式: void *::operator new(size_t size); ...
- Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序
栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...
- Cpp 对象模型探索 / 类静态成员函数的调用方式
一.普通静态成员函数的调用方法 栗子: class CA { public:static void func() {} };int main() {CA A;A.func();CA::func();r ...
- Cpp 对象模型探索 / 类普通成员函数的调用方式
C++设计时有一个要求,类普通成员函数的调用性能要和全局函数差不多.所以编译器在处理类的普通成员函数的宗旨是将其当作全局函数来处理. 为了达到上述目的,编译器会对类的普通成员函数进行如下操作: 在函数 ...
- Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机
class A { public:A() {};A(const A& obj) {}A& operator=(const A& obj) { return *this; } } ...
最新文章
- angularjs 让当前路由重新加载_Vuerouter(路由)
- 常量 - PHP手册笔记
- cocos2d-x 3.8.1的骨骼动画加载方法addArmatureFileInfo仍然存在问题
- CTFshow 爆破 web23
- SpringBatch接口BatchConfigurer详解
- 仿照支付宝账单界面--listview分组显示 用来做!发!财树充值交易明细
- 多个虚拟主机服务器,Windows多个虚拟主机服务器
- 【Julia】Julia v1.5.1 更改Pkg存放位置
- 设计模式:策略模式(C++)【诸葛亮的锦囊妙计】
- vue 图片切换动态绑定
- Threejs中使用A*算法寻路导航,Threejs室内室外地图导航
- 关于浮动元素,你还在自己计算位置吗?来看看 Floating UI 吧
- 我从外包公司辞职了!
- 蓝牙耳机单次续航排名,续航最久的蓝牙耳机推荐
- 面试中关于MySQL十连问
- 什么是POJO?没有你想象中那么复杂!
- 传统算法与神经网络算法,常见的神经网络算法有
- Photo Album: 8.14 庞贝-那不勒斯
- 科研小技巧——MATLAB的编码风格
- qq农场不换html5还用flash,QQ农场使用问题完整解答(6)
热门文章
- javascript 编程思想
- 简单讨论火车票系统后面的架构设计
- [摘抄]一些软件设计的原则
- python获取原图GPS位置信息,轻松得到你的活动轨迹
- SpringCloud教程- 服务链路追踪(Spring Cloud Sleuth)(SpringCloud版本Greenwich.SR4)
- reactjs css modules解决组件间样式覆盖问题
- ubuntu apt-get update 由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32
- DBeaverEE7.3.0安装教程
- helm部署Loki
- K8S Service服务用于对外暴露应用