在c++中声明并删除这个版本的2D数组

declare and delete this version of a 2D array in c++

本文关键字:版本 2D 数组 删除 c++ 声明      更新时间:2023-10-16
int *array[10];
for(int i = 0; i < 10; i++)
    array[i] = new int[10];
//...
void passFunc(int *a[10]) //array containing pointers
{
    //...
}
passFunc(array); 

我想弄清楚如何声明和删除这个版本的2D数组。我开始使用int **数组,但为了使一段代码更容易,我需要切换到*[]。有人能帮我吗?我试着编译我的实际代码(上面的代码只是一个例子),它看起来像这样:

int* filedata[LENGTH] = new int*[LENGTH]; //ERROR: array must be initialized with brace- enclosed identifiers.

编辑:谢谢!

就像这样

 int** array = new int*[sizeX];
 for(int i = 0; i < sizeX; ++i)
   array[i] = new int[sizeY];

删除

for(int i = 0; i < sizeX; ++i)
   delete [] array[i];
delete [] array;

如果我正确理解了你想要的,那么分配和释放将看起来像

int ** filedata = new int * [LENGTH];
for ( int i = 0; i < LENGTH; i++ ) filedata[i] = new int [LENGTH];
//...
for ( int i = 0; i < LENGTH; i++ ) delete [] filedata[i];
delete [] filedata;

给出的替代版本:

 int** array = new int*[sizeX];
 int *pool = new int[sizeX * sizeY];
 for(int i = 0; i < sizeX; ++i, pool += sizeY)
   array[i] = pool;
删除:

 delete [] array[0];
 delete [] array;

这样做的好处是:

  1. 无论列数如何,只需要调用new[]delete[]两次。在前面的回答中,对newdelete的调用次数取决于列的数量。这样可以减少碎片,如果列的数量非常大,还可以提高速度。

  2. 数据连续。你可以使用一个简单的偏移量来访问2d数组中的任何元素。

缺点是每行的列数必须相同,否则很难维护。