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

一、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!)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值