一、new 调用过程

1、测试代码

class CTest
{
public:CTest(){}
};int main()
{CTest *pt1 = new CTest();delete pt1;return 0;
}

在 new 的位置打下断点,查看反汇编代码(调试 -> 窗口 -> 反汇编),得到如下代码,

查看C++源码,获取 operator new 的实现函数,如下

2、流程图如下

二、总结

1、new 执行过程,简述如下:

(1)获取需要申请的内存的大小。

(2)执行 operator new (size)。

A、执行 malloc() 函数,若执行成功,则直接退出函数。

B、若执行失败,则判断是否有用户自定义的 new_handler 函数,并且该函数返回非0,若上述成立则重新尝试申请内存,否则抛出异常并退出。

(3)申请内存成功之后,若该类存在构造函数,则调用该构造函数,否则 new 操作结束。

下面是定义了 new_handler 函数,并且返回值为非 0 的代码,结果就是无限循环申请。

#include <windows.h>
#include <new.h>
#include <iostream>int my_new_handler(size_t count)
{static size_t sum = 0;sum++;std::cout << "重新申请 " << sum << std::endl;return 1;
}
int main()
{_set_new_handler(my_new_handler);while (true){int* p = new int[10000000];}return 0;
}

结果

2、new 和 operator new 的区别

(1)new 是运算符,里面的执行的代码包括 operator new 和类的构造函数(若存在)。

(2)operator new 是函数,C++提供一个默认版本,里面包含了 malloc 和 异常处理。做为程序员,所能控制的两个函数是 operator new 函数和 new_handler 回调函数,前者可以对其进行重载,实现自己的内存分配函数,后者可以对其编写,实现当内存申请失败时所需要执行的操作,这样就避免了程序抛出异常。

(SAW:Game Over!)

Cpp 对象模型探索 / new 运算符内部调用过程分析相关推荐

  1. Cpp 对象模型探索 / delete 运算符内部调用过程分析

    一.delete 调用过程 1.测试代码,在 delete 处打下断点. class CTest { public:CTest() {}~CTest() {} };int main() {CTest* ...

  2. Cpp 对象模型探索 / 虚函数的调用方式

    虚函数有两种调用方式: 方案1,直接使用函数地址调用. 方案2,通过对象的虚函数表指针找到虚函数表,从而得到函数地址,完成调用. 应用场景主要有如下三种情况: 当对象直接调用时,采用方案 1 调用虚函 ...

  3. Cpp 对象模型探索 / 父类和子类调用构造函数和析构函数的顺序

    2018-03-19 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 一.建立对象过程 father → son 栗子: class Parent {public:Parent ...

  4. Cpp 对象模型探索 / 系列文章的索引

    一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...

  5. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序

    栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...

  6. Cpp 对象模型探索 / 类静态成员函数的调用方式

    一.普通静态成员函数的调用方法 栗子: class CA { public:static void func() {} };int main() {CA A;A.func();CA::func();r ...

  7. Cpp 对象模型探索 / 类普通成员函数的调用方式

    C++设计时有一个要求,类普通成员函数的调用性能要和全局函数差不多.所以编译器在处理类的普通成员函数的宗旨是将其当作全局函数来处理. 为了达到上述目的,编译器会对类的普通成员函数进行如下操作: 在函数 ...

  8. Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机

    class A { public:A() {};A(const A& obj) {}A& operator=(const A& obj) { return *this; } } ...

  9. Cpp 对象模型探索 / 继承关系下的虚函数手动调用

    一.多态机理 #include <iostream>class Father { public:virtual void Func1(){std::cout << " ...

最新文章

  1. EOS资源模型(2)资源使用
  2. 设计模式在Netty中的应用-工厂模式源码举例
  3. 柴油机制造商QMD谈System Center 2012实践
  4. node path html模块,深入理解node.js之path模块
  5. Spark SQL应用解析
  6. vue打包后路径404问题解决方法
  7. Spring 应用开发框架 Spring Boot 2.3.0 最新版本发布
  8. Chinese_PRC
  9. BZOJ 1013: [JSOI2008]球形空间产生器sphere
  10. windows7、windows8、windows10、xp系统下载安装包及教程(U盘制作、直接安装)
  11. 天堂2私服架设技术教程
  12. VB6 用ODBC连接数据库
  13. 基于Python实现身份证号码验证
  14. python输出实时时间
  15. Spring Cloud微服务实战_PDF电子书下载 高清 带索引书签目录_翟永超(著)
  16. 淘宝卖家过劳死VS跳楼死
  17. 各宽带接入服务商简称整理
  18. java需要高智商,心理学家:真正高智商的人,根本不需要朋友
  19. 【Unity Shader】关于Stencil的理解小记
  20. 中华数据库与运维安全大会全程解析

热门文章

  1. Android学习笔记系列四2 —— Activity的生命周期
  2. C++扬帆远航——3(打印图形)
  3. 【ZZ】字符编码笔记:ASCII,Unicode和UTF-8
  4. Android 第三课 构建简单的用户界面
  5. Linux网络基本网络配置
  6. MSSQL数据库全库批量替换
  7. pandas将表中的字符串转成数值型
  8. 【2020蓝桥杯】Python组真题解析 - 第十一届蓝桥杯
  9. gorm的零值问题:默认仅更新非零值
  10. 使用ssh连接WSL