如何在多维数组上调用 new
How to call new on a multi-dimensional array
我正在尝试编译以下代码:
bool **copyBools( bool const * const * const input )
{
bool retval[4][4] = new bool[4][4];
for( int i=0; i<4; ++i )
{
for( int j=0; j<4; ++j )
{
retval[i][j] = input[i][j];
}
}
return retval;
}
但是,它不会编译并给出这些错误。 第一个错误在bool retval
行上,第二个错误在return
行上:
error: array must be initialized with a brace-enclosed initializer
error: cannot convert ‘bool (*)[4]’ to ‘bool**’
我的理解是,[][]
数组与**
是一回事。 这不是真的吗? 这段代码有什么问题? 为二维数组调用 new 的正确方法是什么? 为什么我不能将其作为**
退回?
bool retval[4][4] = new bool[4][4];
返回类型是一个指针,您必须将其分配给指针变量而不是数组变量。
我的理解是 [][] 数组与 ** 是一回事。这不是真的吗? 为什么我不能将其作为**退回?
不,因为数组衰减不是递归的。当你做new bool[4][4]
时,你会得到bool (*) [4]
作为返回的指针(这里只有第一级衰减了)。
为二维数组调用 new 的正确方法是什么?
这
bool (*retval) [4] = new bool[4][4];
应该工作。每个元素都像往常一样访问 retval[i][j]
,只是retval
的类型对于不知情的人来说有点奇怪;它是指向四个布尔值数组的指针。但是,以下替代方法(两个维度都丢失)更安全,因为编译器可以检查长度,因为它是类型的一部分;但是,这种方法也丢失了第二个维度。如果要保留这两个维度,请使用 std::array<std::array<bool, 4>, 4>
。此方法和std::array
方法的警告是,它们只能在第一个维度未知时使用,但所有剩余维度在编译时都是已知的;这是用于声明指向数组的指针。即使编译时所有维度都未知,也可以使用以下方法。
这种替代方法是使用指针数组,并用布尔数组浸渍此数组中的每个指针。
bool** ptrs = new bool*[4];
for (size_t i = 0; i < 4; ++i)
ptrs[i] = new bool[4];
这允许您以bool**
.在这里,new bool*[4]
在第一级衰减并返回一个bool**
指针。但是,如果两个维度都未知,则推荐的(惯用)方法是使用 std::vector
.
推荐阅读: 如何在C++中使用数组?
您需要在此处使用双指针:
bool** retval = new bool*[4];
for( int i=0; i<4; ++i )
{
retval[i] = new bool[4];
for( int j=0; j<4; ++j )
{
retval[i][j] = input[i][j];
}
}
注意:您也可以在这里使用多维向量,
- 在不同的编译器版本中调用new[]和delete[]
- 通过传递外部指针或内部调用 new 构造的类,我可以在销毁时天真地删除这个指针吗?
- C++:光线追踪器导致内存不足错误 - 由于反复调用"new"?
- 在CUDA内核中调用new运算符
- 为什么智能指针不能在其构造函数中为我调用 new()?
- 如果我在 C++ 中调用 new,但堆内存不足,会发生什么情况
- 如何在多维数组上调用 new
- 运算符在C++中何时调用'new'构造函数
- 调用"new"以存储到shared_ptr的引用向量中
- 为什么连续调用new[]不会分配连续内存
- Java可以初始化类似C++的对象数组中的对象,而不必循环和调用new
- 如何为数组的类型调用 new 运算符
- 在条件调用new时调用delete
- c++重载和继承,调用new方法
- 在c++ 11中,如何调用new并为对象保留足够的内存?
- 调用'new'如何调用用户定义的放置分配函数?
- 在同一个vtkSmartPointer上调用new两次是不安全的吗?
- 当调用new函数时,返回地址值发生了什么?
- 在同一个for循环中多次调用new
- C++ 构造函数/析构函数调用 &对动态创建的数据调用"new"是否会删除旧数据?