这个问题在这里已经有一个答案:>
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,直到我尝试
> 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 []匹配.