读者如果觉得我文章还不错的,,希望可以多多支持下我,文章可以转发,但是必须保留原出处和原作者署名。为了获取更好的阅读体验请关注微信公众号。更多内容请关注我的微信公众号:cpp手艺人。

今天我们主要学习知识点:
1.new的调用流程。
2.我们重载了new之后能干啥。
3.placement new干啥的。
4.set_new_handler是什么。
1. operator new操作符的原理
1.1 operator new 调用流程
测试代码如下:
/****************************************************************************
**
** Copyright (C) 2019 635672377@qq.com
** All rights reserved.
**
****************************************************************************/
/*
测试对象的new、delete,在VS2017更容易观察
*/
#ifndef obj_new_delete_h
#define obj_new_delete_h
#include <new>
#include <memory>
#include <iostream>
using std::cout;
using std::endl;
namespace obj_new_delete
{
class Obj
{
public:
Obj():mCount(0) {
cout << "Obj ctor" << endl; }
~Obj() {
cout << "~Obj dtor" << endl; }
private:
int mCount;
};
void test_new_obj()
{
Obj *obj = new Obj();
delete obj;
}
}
#endif // obj_new_delete_h
我们在Obj *obj = new Obj();处下个断点,再打开反汇编窗口,我摘取主要的代码。 markdown的汇编代码不能高亮,看的很难受啊,还是前往公众号可以获取更好的阅读体验。
; Obj *obj = new Obj();
00DE2C47 push 4
00DE2C49 call operator new (0DE141Ah)
00DE2C4E add esp,4
00DE2C51 mov dword ptr [ebp-0ECh],eax
00DE2C57 mov dword ptr [ebp-4],0
00DE2C5E cmp dword ptr [ebp-0ECh],0
00DE2C65 je obj_new_delete::test_new_obj+7Ah (0DE2C7Ah)
00DE2C67 mov ecx,dword ptr [ebp-0ECh]
; 调用对象的构造函数
00DE2C6D call obj_new_delete::Obj::Obj (0DE1456h)
我在::operator new的汇编代码处,点击菜单“转到源代码”,就可以还原为C++代码,这个代码的源文件叫做new_scalar.cpp:
void* __CRTDECL operator new(size_t const size)
{