在这个excellent answer by 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 或类型 - id 表示数组类型), new-expression 生成指向数组初始元素(如果有)的指针。 [注意: new int 和 new int [10] 的类型为 int * ,类型为 new int [i] [10] 是 int(*)[10] - 结束记录]
我知道new int [10]
正在行动;应该使用delete [] p
而不是delete p
释放我得到的内容。然而,我需要的似乎是后者,其中分配不是整数数组而是数组本身,作为单个/整个对象。
有办法吗?或者我试图这样做本身就表明了对C ++类型系统的误解?或者它是对的,但标准是不允许的?
旁白:当一个函数采用一个大小固定的数组时,如选项2所示,恕我直言,为调用函数做的最好的事情是声明一个自动数组而不是求助动态分配一个并担心清理。
答案 0 :(得分:1)
是的,实际上在您引用的标准文本中有建议:
int (*arr_ptr)[10] = new int[1][10];
new-expression返回的指针具有类型int (*)[10]
,即指向10个int的数组的指针。您需要delete[]
才能将其删除。
答案 1 :(得分:0)
如果我已经正确理解了你想要的东西,那么你可以使用std :: array。例如
{
typedef std::array<int, 10> Array10;
Array10 *p = new Array10;
delete p;
}