我有一个关于指针和数组的角落案例。
如何在堆上分配固定大小(自动)数组?让我们马上了解代码,了解我想要问的内容:
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;
答案 0 :(得分:3)
这是Select FirstName, LastName
from Customer
Inner Join RegisteredCustomers on Customer.Customerid = RegisteredCustomer.Customerid
and CustomerType = 1
的行为,这有点令人惊讶。即使new
是ArrayOf10Ints
的别名,但当您在int[10]
表达式中使用它时,结果就像您正在编写new
一样。
当分配的对象是数组时(即使用 noptr-new-declarator 语法或 new-type-id 或 type-id 表示数组类型), new-expression 生成指向数组初始元素(如果有)的指针。
因此,在您的示例中,new int[10]
表达式返回new
,因此出错。
解决方法是执行您显示的内容
int *
或将数组放在ArrayOf10Ints* q = new ArrayOf10Ints[1];
delete[] q;
中,或使用struct
。
请注意,即使您要写
std::array
然后您必须使用int* p = new ArrayOf10Ints;
,因为在这种情况下也会调用delete[] p
。
答案 1 :(得分:0)
注意:出于讨论之外的原因,我需要完成这个
当然不是,因为错误的东西不起作用。
请改用typedef array<int,10> ArrayOf10Ints;
int f() {
ArrayOf10Ints * p = new ArrayOf10Ints;
// ...
delete p;
}
。此代码应该可以顺利运行:
new
但我不建议您自己管理delete
和$('#hollowCircleCv,#fontTextCv,#circleCv,#hollowSquareCv,#squareCv').click(function(){
var isEraserActive = false;
});
,除非您完全确定需要。