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