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