微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么Array * new Array? C失败

这个问题在这里已经有一个答案:> Using new with fixed length array typedef4个
> Is it possible to dynamically create an array of constant size in C++?4个
我一直以为T * p = new T;对于所有T都有效C,直到我尝试
int main()
{
    typedef int Array[2];
    Array *p = new Array;
}

并得到这个可爱的错误我无法解密:

error C2440: 'initializing' : cannot convert from 'int *' to 'Array (*)'

有人可以解释为什么这是一个错误

解决方法

如果您动态分配数组类型,则可以获得指向其第一个元素的指针.

§5.3.4 [expr.new] Entities created by a new-expression have dynamic storage duration. If the entity is a non-
array object,[…]. If it is an array,the new-expression returns a pointer to the initial element of the array.

所以,因为你分配一个数组类型的对象,你得到一个int *:

int *p = new Array;

这与使用typedef没有什么不同:

int *p = new int[2];

这也不符合你的T * p = new T;规则.也就是说,你绝对不能这样做:

int (*p)[2] = new int[2];

我意识到这种混乱可能是由于新的… []作为一种特殊类型的表达与新的…不同而引起的,其中新数组适用于后一种情况.我们经常提出可能会说“new []应该总是匹配delete []”.那条规则有点误导.这里真正意义的是,数组类型的new应该始终与delete []匹配.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐