新表达式是否会返回指向数组的指针

Will the new expression ever return a pointer to an array?

本文关键字:数组 指针 返回 表达式 是否      更新时间:2023-10-16

在AndreyT的这个很好的回答中,他解释说,在C中,当一个函数需要一个在编译时维数已知的数组时,声明这是一个主要的技术级错误。

void process_array(int *ptr, size_t plen);

而不是

void process_array(int (*arr_ptr)[10]);

此外,他认为许多程序员忘记了第二种选择,只知道第一种选择。他写道,这种行为的原因之一是当一个数组需要动态分配并传递给第二个版本时,程序员不知道该怎么做;他们习惯于返回int * int *p = malloc(sizeof(*p) * 10)。在 C 语言中,这样做的方法是,正如他所展示的那样。

int (*arr_ptr) [10] = malloc(sizeof(*arr_ptr));

这让我思考如何在C++中做同样的事情。我知道我们已经std::arraystd::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,恕我直言,调用函数最好的办法是声明一个自动数组,而不是诉诸动态分配一个数组并担心清理。

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

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

新表达式返回的指针的类型为 int (*)[10] ,即指向 10 个整数数组的指针。您需要delete[]才能删除它。

如果我正确理解了你想要什么,那么你可以使用std::array。例如

{
    typedef std::array<int, 10> Array10;
    Array10 *p = new Array10;
    delete p;
}