|
语法
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 适用于关联的数组类型。
|
|