本文迁移自博客园。
不同于C语言中的 malloc/free 是库函数,C++ 语言中的 new/delete 是运算符,不是库函数。
new/delete 执行流程
我们经常会接触到的是 new/delete operator(就是 new/delete 运算符)。其中 new operator 背后会调用 operator new 和 placement new 函数,而 delete operator 背后会调用 operator delete 函数。
对于 new operator
而言,它的执行流程为:
1)通过 operator new 函数申请内存
2)使用 placement new 函数调用构造函数(简单类型如 int,可忽略此步)
3)返回内存指针
而对于 delete operator
而言,它的执行流程为:
1)调用析构函数(简单类型忽略此步)
2)通过 operator delete 函数释放内存
new operator
调用 new,首先会先调用 operator new 函数申请内存。根据《深度探索C++对象模型》一书 6.2 节,一个不考虑异常处理的 operator new 函数经典实现如下:
1 | extern void* |
可以看出,operator new 底层实际是调用了 malloc 来申请内存的。
接下来就是调用 placement new 来对以申请到的内存进行初始化,也就是调用类的构造函数。实际上,placement new 只是 operator new 的另一个重载版本,如下:
1 | void* |
placement new 就如此简单吗?实际并非如此,这只是它的一半操作,另一半操作是调用类的构造函数对已申请到的内存进行初始化。
delete operator
调用 delete,首先会调用类的析构函数,然后再调用 operator delete 函数释放类占用的内存。operator delete 的简单实现如下:
1 | extern void |
也就是说,operator delete 的底层实际调用的还是 free 库函数。
更多参考资料
深入探究 C++ 的 new/delete 操作符
浅谈 C++ 中的 new/delete 和 new/delete
C++ 中的 new、operator new 与 placement new
关于指针,还可参考之前指针系列博文。