【发布时间】:2013-05-14 03:17:24
【问题描述】:
new char[n] 和 new (char[n]) 有什么区别吗?
我在生成的代码中有第二种情况,g++ (4.8.0) 给了我
ISO C++ does not support variable-length array types [-Wvla]
这让我想到这两个是否相同。
-
new char[n]表示“分配n类型为char的对象。 -
new (char[n])的意思是“分配 1 个array of n chars类型的对象”吗? - 删除第一个很清楚。
- 我应该用
delete或delete[]删除第二个吗? - 还有其他我应该注意的区别吗?
- 当软件的其他部分期望使用第二种情况时,我可以安全地删除括号并将第二种情况转换为第一种情况吗?
代码是由第三方软件生成的(并被软件的其他部分使用),所以我不能只是“使用矢量代替”。
这是最小的例子:
int main (void)
{
int n(10);
int *arr = new (int[n]); // removing parentheses fixes warning
*arr = 0; // no "unused variable" warning
return 0;
}
【问题讨论】:
-
编译器和版本是什么?
-
gcc 4.8.0,添加到问题中
-
我很惊讶它允许从
int(*)[n]转换为int*。 -
@aschepler 我认为 VLA 的类型是
int*。他们int(*)[n]不能作为一种类型存在。 -
哦,我明白了。 “当分配的对象是一个数组(即使用 noptr-new-declarator 语法或 new-type-id 或 type-id 表示数组类型)时,new-expression 产生一个指向初始元素的指针 (如果有的话)的数组。”
标签: c++ memory-management