new 的工作方式

allocation-expression(包含 new 运算符的表达式)执行三类操作:

  • 定位并保留要分配的对象的存储。 此阶段完成后,将分配正确的存储量,但它还不是对象。

  • 初始化对象。 初始化完成后,将为成为对象的已分配存储显示足够的信息。

  • 返回指向派生自 new-type-nametype-name 的指针类型的对象的指针。 程序使用此指针来访问最近分配的对象。

new 运算符调用函数 operator new。 对于任何类型的数组以及不属于 class、struct 或 union 类型的对象,调用全局函数 ::operator new 来分配存储。 类类型对象可基于每个类定义其自己的 operator new 静态成员函数。

当编译器遇到用于分配类型 type 的对象的 new 运算符时,它将发布对 type**::operator new( sizeof(** type ) ) 的调用;或者,如果未定义用户定义的 operator new,则为 ::operator new( sizeof( type ) )。 因此,new 运算符可以为对象分配正确的内存量。

备注

operator new 的参数属于 size_t 类型。在 DIRECT.H、MALLOC.H、MEMORY.H、SEARCH.H、STDDEF.H、STDIO.H、STDLIB.H、STRING.H 和 TIME.H 中定义此类型。

该语法中的选项允许 placement 的规范(请参阅 new 运算符的语法)。 placement 参数仅可用于 operator new 的用户定义的实现;它允许将额外信息传递给 operator new。 如果类 T 具有成员运算符 new,则将具有 placement 字段的表达式(例如,T *TObject = new ( 0x0040 ) T;)转换为 T *TObject = T::operator new( sizeof( T ), 0x0040 );;否则将其转换为 T *TObject = ::operator new( sizeof( T ), 0x0040 );。

placement 字段的原始用途是允许在用户指定的地址分配硬件相关对象。

备注

虽然上面的示例仅显示 placement 字段内的一个参数,但不限制可通过此方法传递给 operator new 的额外参数的数目。

即使已为类类型定义 operator new,也可以采用此示例的形式来使用全局运算符:

T *TObject =::new TObject;

范围解析运算符 (::) 强制使用全局 new 运算符。

请参见

参考

new 运算符 (C++)