new 表达式(仅限 C++)

new 操作程序提供动态存储器分配。

新运算符语法

读取语法图跳过可视语法图::new(argument_list)(类型)new_type(initial_value)

如果使用作用域解析运算符 (::) 作为 new 前缀,那么将使用全局 operator new() 。 如果指定 argument_list,那么将使用与该 argument_list 对应的重载 new 运算符。 type 是现有内置或用户定义的类型。 new_type 是尚未定义的类型,可以包含类型说明符和声明符。

包含 new 运算符的分配表达式用于在要创建的对象的空闲存储器中查找存储器。 新表达式 返回指向创建的对象的指针,并可用于初始化该对象。 如果对象是数组,那么将返回指向初始元素的指针。

不能使用 new 运算符来分配函数类型, void或不完整的类类型,因为这些类型不是对象类型。 但是,您可以使用 new 运算符将指针分配给函数。 无法使用 new 运算符创建引用。

当要创建的对象是数组时,只有第一个维可以是一般表达式。 所有后续维都必须是求值为正值的 整数 常量表达式。 即使使用现有 类型 ,第一个维度也可以是常规表达式。 您可以使用 new 运算符创建具有零界限的数组。 例如:
char * c = new char[0];

在这种情况下,将返回指向唯一对象的指针。

使用 operator new()operator new[]() 创建的对象存在,直到调用 operator delete()operator delete[]() 以释放该对象的内存为止。 不会对使用 new 创建的对象隐式调用 delete 运算符或析构函数,该对象在程序结束之前未显式取消分配。

如果在新类型中使用括号,那么括号也应围绕新类型以防止语法错误。

在以下示例中,将为指向函数的指针数组分配存储器:

void f();
void g();

int main(void)
{
      void (**p)(), (**q)();
      // declare p and q as pointers to pointers to void functions
      p = new (void (*[3])());
      // p now points to an array of pointers to functions
      q = new void(*[3])(); // error
      // error - bound as 'q = (new void) (*[3])();'
      p[0] = f;  // p[0] to point to function f
      q[2] = g;  // q[2] to point to function g
      p[0]();    // call f()
      q[2]();    // call g()
      return (0);
}

但是,第二次使用 new 会导致错误绑定 q = (new void) (*[3])()

要创建的对象的类型不能包含类声明,枚举声明或 constvolatile 类型。 它可以包含指向 constvolatile 对象的指针。

例如,允许 const char* ,但不允许 char* const