8

在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-idtype-id表示数组类型)时,new-expression产生一个指向初始元素的指针(如果任何)的数组。[注意:new intnew int[10]的类型都是int *并且new int[i][10]的类型是int (*)[10]结束注释]

我知道这new int [10]是在行动;我得到的应该使用delete [] p而不是释放delete p。但是我需要的似乎是后者,其中分配不是整数数组而是数组本身,作为单个/整个对象。

有没有办法做到这一点?或者我试图这样做本身就表明对 C++ 类型系统的误解?还是正确但标准不允许?


旁白:当一个函数采用一个大小固定的数组时,如选项 2 所示,恕我直言,调用函数最好的办法是声明一个自动数组,而不是诉诸动态分配一个数组并担心清理。

4

2 回答 2

1

是的,实际上在您引用的标准文本中建议:

int (*arr_ptr)[10] = new int[1][10];

new 表达式返回的指针具有类型int (*)[10],即指向 10 个整数数组的指针。你需要delete[]删除它。

于 2014-09-25T01:39:46.183 回答
0

如果我正确理解了您想要的内容,那么您可以使用 std::array。例如

{
    typedef std::array<int, 10> Array10;

    Array10 *p = new Array10;
    delete p;
}
于 2013-10-19T16:19:14.970 回答