C++的设计者希望它能处理各种各样的问题。因此,C++的某些特征对一些特殊的应用非常重要,这其中控制内存分配就是重要的一环。new和delete正是这场分配内存的游戏中的主脚。
C++中的new其实包含三个部分:new operator , operator new, placement new
通常我们在c++中使用的new其实指的是new operator,例如:
string *str = new string("it is a string");
实际上,在执行这个表达式的时候,执行了三步操作
1. new 表达式调用一个operator new(或者是operator new[])的标准库函数,该函数来分配一快足够大的、原始的、未命名的内存空间,用来存储特定类型的对象(或者对象数组)
2.编译器运行相应的构造函数以构造这些对象,并为其传入初值
3.对象被分配了空间并构造完成,返回一个指向该对象的指针
如果应用程序希望自己控制内存分配的过程,则他们需要定义自己的operator new函数和operator delete。编译器发现一条new表达式后,在程序中查找可供调用的operator函数。如果被分配的对象是类类型,则编译器现在类及其基类的作用域中查找,否则编译器在全局作用域查找,如果没找到,才使用标准库的版本,总体来说,顺序如下:
1.类及其基类
2.全局作用域
3.标准库
注意:1.在类里定义operator new函数会被隐式的声明为静态的 2. 不允许用户重载 void *operator new(size_t, void*); 这个函数,这个函数是被标准库使用的