可以看下侯捷 C++内存管理机制,b站课程资源,并结合阅读csdn图片笔记和segmentfault笔记。
c++的内存管理调用如下图,底层是平台相关的,如windows/linux提供的内存分配调用。但内存相关不利于跨平台。
new关键字原理
new调用operator new
new命令经编译器转换相当于左下角。结合转载 C++中new、operator new和placement new的区别(写的好)可知,new关键字背后做了三件事:
- 用
operator new
分配内存 - 指针转型
- 调用构造函数
所以new会调用operator new
。如果类有重载,即调用类重载的operator new
。否则若全局有重载,则调用全局版本的。最后如果没重载,调用默认的。
operator new调用malloc
operator new
的默认实现是有源码的,如图右上方所示。所以operator new
其实就在调用malloc
。
- 从while循环可知,如果没有调用成功,则继续循环。
- 循环内调用callnewh,即new handler,这是cpp留给程序员在内存分配失败时补救的机制,详见std::new_handler,std::set_new_handler和