如何在堆上创建一个自动数组[N],使用new
How to create an automatic array[N] on the heap, with new
我有一个关于指针和数组的角大小写。
如何在堆上分配固定大小(自动)数组?让我们马上进入代码,了解我想问的问题:
typedef int ArrayOf10Ints[10];
int f()
{
ArrayOf10Ints * p = new ArrayOf10Ints; // Error: cannot initialize a variable of type 'ArrayOf10Ints *'
// (aka 'int (*)[10]') with an rvalue of type 'int *'
ArrayOf10Ints * q = new ArrayOf10Ints[1] // OK: allocates space for 10 ints
delete q; // Warning: use delete []
}
为什么分配p
的表达式不起作用?为什么右值是int*
而不是ArrayOf10Ints*
?为什么q
有效?
注意:我的目标是了解分配p
和q
的意外行为。正如其他人所指出的,有许多直接的方法可以解决这个问题。例如,在我的例子中,我使用一个指针来表示数组是可选的——它可能存在,也可能不存在——所以我会这样做:
boost::optional<std::array<int, 10> > optional_array;
这是new
的一种行为,有些令人惊讶。尽管ArrayOf10Ints
是int[10]
的别名,但当您在new
表达式中使用它时,结果就像您在编写new int[10]
一样。
这在[Epr.new]/5中指定
当分配的对象是数组时(也就是说,使用noptr new declarator语法,或者new type id或type id表示数组类型),新表达式会产生一个指向数组初始元素(如果有)的指针
因此,在您的示例中,new
表达式返回一个int *
,因此出现错误。
一个变通方法是按照显示的操作
ArrayOf10Ints* q = new ArrayOf10Ints[1];
delete[] q;
或者将阵列放置在struct
中,或者使用std::array
。
注意,即使你要写
int* p = new ArrayOf10Ints;
然后必须使用delete[] p
,因为在这种情况下也调用了operator new[]
。
实时演示
注意:由于超出讨论范围的原因,我需要做这个
当然不会,因为错误的事情是行不通的。
请改用std::array<int,10>
。这个代码应该工作得很顺利:
typedef array<int,10> ArrayOf10Ints;
int f() {
ArrayOf10Ints * p = new ArrayOf10Ints;
// ...
delete p;
}
但是,我不建议您自己管理new
和delete
,除非您绝对确定需要。
相关文章:
- 在类c++中使用new声明数组
- 在将 new 与指针一起使用时,创建数组的指定长度
- 声明C++数组(带或不带 "new" 关键字)
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 使用new创建数组而不声明大小
- 正确分配放置 new 的数组
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 使用new时如何重新分配dyyanmic数组,不使用realloc删除C++?
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 使用可变模板列表初始化数组,并放置new
- 如何获取由 new 创建的数组的开始和结束
- 使用 "new" 命令在 C++ 中的类构造函数中分配 2D 数组
- 构造函数不会将使用 new 初始化的数组作为参数
- 将指针返回使用New创建的数组数组
- 使用泛型成员变量"placement new"结构/类数组的正确方法是什么?
- 将内存分配给 2D 数组时,“new int*[rowCount];”的含义是什么?是 2D 数组,是指向数组的指针数组
- 使用 Marshal.FreeHGlobal() 来释放以前在本地分配了"new"的数组?
- 向量在我的类中.错误:数组new [-fpermissive]中的圆括号初始化项
- 新增[size]对象(args ..)在数组new [-fpermissive]中添加圆括号初始化器
- 错误:数组new中的size必须是整型[-fpermissive]