新表达式是否会返回指向数组的指针
Will the new expression ever return a pointer to an array?
在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::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,恕我直言,调用函数最好的办法是声明一个自动数组,而不是诉诸动态分配一个数组并担心清理。
是的,实际上在您引用的标准文本中建议:
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;
}
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”