LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 201|回复: 0

new 运算符

[复制链接]
发表于 2024-1-22 23:29:17 | 显示全部楼层 |阅读模式
语法
new-expression:
  optnewnew-placementoptnew-type-idnew-initializeropt
  optnewnew-placementopt(type-id)new-initializeropt

new-placement:
  ( expression-list )

new-type-id:
  type-specifier-seqnew-declaratoropt

new-declarator:
  ptr-operatornew-declaratoropt
  noptr-new-declarator

noptr-new-declarator:
  [expression]attribute-specifier-seqopt
  noptr-new-declarator[constant-expression]attribute-specifier-seqopt

new-initializer:
  (expression-listopt)
  braced-init-list

备注
如果未成功,new 将返回零或引发异常。 有关详细信息,请参阅 new 和 delete 运算符。 可以通过编写自定义异常处理例程并调用 _set_new_handler 运行时库函数(使用函数名作为其参数)来更改此默认行为。

要了解如何使用 C++/CLI 和 C++/CX 在托管堆上创建对象,请参阅 gcnew。

备注

Microsoft C++ 组件扩展 (C++/CX) 支持 new 关键字,可用于添加 vtable 槽条目。 有关详细信息,请参阅 new(vtable 中的新槽)

使用 new 为 C++ 类对象分配内存时,将在分配内存后调用对象的构造函数。

使用 delete 运算符解除由 new 运算符分配的内存。 使用 delete[] 运算符删除由 new 运算符分配的数组。

以下示例先分配然后释放一个二维字符数组,数组的大小为 dim x 10。 分配多维数组时,除第一个维度外的所有维度都必须是计算结果为正值的常数表达式。 最左侧的数组维度可以是任何计算结果为正值的表达式。 使用 new 运算符分配数组时,第一个维度可以为零;new 运算符返回一个唯一指针。

C++

复制
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
type-id 不能包含 const、volatile、类声明或枚举声明。 以下表达式格式不正确:

C++

复制
volatile char *vch = new volatile char[20];
new 运算符不分配引用类型,因为它们不是对象。

new 运算符不能用于分配函数,但可用于分配指向函数的指针。 下面的示例为返回整数的函数分配然后释放一个包含 7 个指针的数组。

C++

复制
int (**p) () = new (int (*[7]) ());
delete p;
如果使用不带任何额外参数的运算符 new,并使用 /GX、/EHa 或 /EHs 选项进行编译,编译器会在构造函数引发异常时生成调用运算符 delete 的代码。

以下列表描述了 new 的语法元素:

new-placement
如果重载 new,就会提供一种传递额外参数的方法。

type-id
指定要分配的类型;它可以是内置类型,也可以是用户定义类型。 如果类型规范非常复杂,则可用括号将其括起来以强制实施绑定顺序。 类型可以是一个占位符(auto),其类型由编译器决定。

new-initializer
为初始化对象提供值。 不能为数组指定初始值设定项。 仅当类具有默认构造函数时,new 运算符才会创建对象数组。

noptr-new-declarator
指定数组边界。 分配多维数组时,除第一个维度外的所有维度都必须是常数表达式,其计算结果为可转换为 std::size_t 的正值。 最左侧的数组维度可以是任何计算结果为正值的表达式。 attribute-specifier-seq 适用于关联的数组类型。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表