请考虑以下代码。这适用于分配单个数组,但是如果需要分配二维数组呢?你会怎么做呢?
#include <iostream>
void alloc(int **num)
{
*num = new int[5];
*num[0] = 5;
}
int main()
{
int *num;
alloc(&num);
std::cout << num[0] << std::endl;
delete [] num;
}
我的目标是将**char
传递给函数并分配它。这可能吗?
答案 0 :(得分:3)
如果需要分配二维数组怎么办?
我的目标是将** char传递给函数并将其分配。
那么,你想要的是指向指针数组的指针(每个都指向一个数组)?这与2D阵列不同,尽管为了简单起见通常也会这样对待。
就像你在分配单个数组时添加了一个额外的间接层一样,你可以添加一个间接层来分配一个指针数组,并指向整数数组。
所以,你可以写一个像void alloc(int ***num)
这样的函数。是的,这是可能的,但不是很好的设计。
但是使用间接指针会使语法更复杂,并且存在用户将空指针传递给函数的风险。相反,更好的选择是使用引用:void alloc(int **&num)
。
由于函数会分配一些东西并“返回一个指针”,因此实际return
指针更有意义:int** alloc()
。更漂亮,不是吗?减少间接更好。
最后,问题是该功能的用户必须知道如何删除分配的内存。是使用new
还是new[]
分配的?甚至可能malloc
?或者该函数是否返回指向静态对象的指针,该指针不得删除?除非单独记录,否则函数的调用者无法知道。
另外,如果其中一个分配失败怎么办?将会有一个例外,早期的分配将泄漏。
解决上述两个问题的C ++方法是使用RAII容器来管理内存。由于您显然希望拥有一个包含指向数组的指针的数组,因此标准库中有一个现成的解决方案:返回std::vector<std::vector<int>>
。如果你想要一个正确的非锯齿状2D数组,即矩阵,那么你可能想为此编写一个自定义RAII容器,可能使用平面std::vector<int>
来实现。请注意,第三方可能已经实施了此类容器。
答案 1 :(得分:0)
您的代码对我来说就像C一样。在C ++中,我(可能)使用自定义类型而不进行任何手动动态分配。例如
typedef std::vector<int> Row;
typedef std::vector<Row> Matrix;
Matrix initMatrix(int nRows,int nCols) {
return Matrix(nRows,Row(nCols));
}
那么在这种情况下你甚至不需要一个函数,但你可以只调用构造函数(让array
为你分配内存)。