C++ 新表达式是否会返回指向数组的指针?
在本文中,他解释说,在C语言中,当一个函数需要一个在编译时已知维数的数组时,声明它是一个主要的技术级错误C++ 新表达式是否会返回指向数组的指针?,c++,arrays,pointers,types,new-operator,C++,Arrays,Pointers,Types,New Operator,在本文中,他解释说,在C语言中,当一个函数需要一个在编译时已知维数的数组时,声明它是一个主要的技术级错误 void process_array(int *ptr, size_t plen); 而不是 void process_array(int (*arr_ptr)[10]); 此外,他认为许多程序员不知道第二种选择,只知道第一种。他写道,造成这种行为的原因之一是,当一个数组需要动态分配并传递给第二个版本时,程序员不知道怎么做;他们非常习惯于int*p=malloc(sizeof(*p)*1
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语法或新的type id或type id表示数组类型),新表达式将生成指向数组初始元素(如果有)的指针。[注:new int和new int[10]都有类型int*,new int[i][10]的类型是int(*)[10]-结束注]
我了解newint[10]
正在运行;我得到的应该使用delete[]p
释放,而不是delete p
。然而,我需要的似乎是后者,其中分配不是整数数组,而是作为单个/整个对象的数组本身
有办法吗?或者我试图做这件事本身就显示出对C++类型系统的误解?或者这是正确的,但标准根本不允许
旁白:当一个函数接受一个大小固定的数组时,如选项2所示,调用函数最好的方法是声明一个自动数组,而不是动态分配一个数组并担心清理。如果我正确理解了您想要的内容,那么您可以使用std::array。比如说
{
typedef std::array<int, 10> Array10;
Array10 *p = new Array10;
delete p;
}
{
typedef std::数组10;
阵列10*p=新阵列10;
删除p;
}
是的,事实上,您引用的标准文本中建议:
int (*arr_ptr)[10] = new int[1][10];
新表达式返回的指针类型为
int(*)[10]
,即指向10个int数组的指针。你需要<代码>删除[]/Cord>删除它。< /P>不。我在问题中明确地指出,使用标准C++库有解决办法,但我想只用语言语法来做,而不是它的库设施。更多的是理解C++类型系统的线条。@ LeunsS2K,这里理解的不是C++类型系统(好的,但不是关键问题);关键问题是new
的语法。执行new
某个数组类型可以获得指向该类型数组的第一个元素的指针,而new
非数组类型可以获得指向非数组类型的整个对象的指针。是的,我同意,应该检查new
的语法,而不是这里的一般类型系统。也同意下一点。该标准引用中更好的亮点是表示数组类型,这解释了数组10test@Cubbi:哈哈。。。也许。我已经忠实地按照文档中的格式进行了格式化,即黑体字和斜体字都来自标准,重点不是我的。答案在您引用的文本中:int(*p)[10]=new int[1][10]
您也可以这样做:int(*p)[10]=reinterpret_cast(::operator new(sizeof(int[10]))
@jrok:但这对我来说似乎是一种攻击;使用多维数组和重新解释\u cast
。不知道,也许这不是黑客攻击。不是问题的完全复制品,但完全回答了这个问题+1不是我问的,而是很接近。它不仅仅返回指向数组的指针,它还返回指向数组指针的数组的第一个元素的指针,因此不能删除它,而只能删除[]
它。它返回指向数组的指针,它不返回指向“指向数组指针的数组的第一个元素”的指针。后者将是新的(int(*[5])[5])
。正如您所说,它确实需要[]
来删除。如果它是int[2][10]
,它不会仍然返回int(*)[10]
,它只不过是指向数组的第一个元素的指针(数组为10int
s)。在前面的例子中,计数是1,但仍然是一个元素数组,因此必须使用delete[]
。是的。“10整数数组”的第一个元素是10整数数组。此外,任何对象都可以被视为一个由1个元素组成的数组,不管它是什么类型的。