在AndreyT 的这个出色回答中,他解释说,在 C 语言中,当一个函数需要一个在编译时知道其维度的数组时,声明一个主要的技术级错误
void process_array(int *ptr, size_t plen);
代替
void process_array(int (*arr_ptr)[10]);
此外,他认为许多程序员忽略了第二种选择,只知道第一种。他写道,原因之一是当一个数组需要动态分配并传递给第二个版本时,程序员不知道该怎么做。他们已经习惯了int *p = malloc(sizeof(*p) * 10)
返回一个int *
. 正如他所展示的,在C语言中,这样做的方法是
int (*arr_ptr) [10] = malloc(sizeof(*arr_ptr));
这让我开始思考如何在 C++ 中做同样的事情。我知道我们有std::array
,std::vector
等,但我有兴趣了解new
' 的用法。所以我试着这样做:
typedef int Array10[10];
Array10 *p = new Array10; // error: cannot convert ‘int*’ to ‘int (*)[10]’
当我将p
' 的类型更改int*
为编译器(GCC 4.8.1)时很高兴。我查阅了 C++11 标准(草案 n3337,§5.3.4/5
)以进一步理解这一点,它说:
当分配的对象是一个数组(即使用noptr-new-declarator语法或new-type-id或type-id表示数组类型)时,new-expression产生一个指向初始元素的指针(如果任何)的数组。[注意:new int和new int[10]的类型都是int *并且new int[i][10]的类型是int (*)[10] —结束注释]
我知道这new int [10]
是在行动;我得到的应该使用delete [] p
而不是释放delete p
。但是我需要的似乎是后者,其中分配不是整数数组而是数组本身,作为单个/整个对象。
有没有办法做到这一点?或者我试图这样做本身就表明对 C++ 类型系统的误解?还是正确但标准不允许?
旁白:当一个函数采用一个大小固定的数组时,如选项 2 所示,恕我直言,调用函数最好的办法是声明一个自动数组,而不是诉诸动态分配一个数组并担心清理。