我一直在想,标准的C++语言中是否有用于删除多维数组的运算符。
如果我们已经创建了一个指向单维数组的指针
int *array = new int[size];
删除操作的样子如下:
delete [] array;
太好了。但是如果我们有一个二维数组,就不能这样做。
delete [][] twoDimenstionalArray;
相反,我们应该像这个例子中那样循环并删除项目。
有人能解释一下为什么吗?
从技术上讲,C++中并不存在二维数组。您使用的是一个一维数组,每个元素都是一个一维数组,以此来模拟二维数组。因为它并不存在,所以C++无法删除它。
由于没有调用的方法
int **array = new int[dim1][dim2];
所有的新增和删除都必须平衡,因此使用 delete [][]
运算符没有意义。
new int[dim1][dim2]
返回大小为 dim1
类型为 int[dim2]
的数组的指针。因此 dim2
必须是编译时常量。这类似于在堆栈上分配多维数组。
delete [][]
(而不显著改变语言)。从语言设计的角度来看,我不确定确切的原因,但我猜测这可能与分配内存有关。当你分配内存时,你正在创建一个数组的数组,每个数组都需要被删除。
int ** mArr = new int*[10];
for(int i=0;i<10;i++)
{
mArr[i]=new int[10];
}
我的 C++ 已经有点生疏了,我不确定这是否在语法上是正确的,但我认为它很接近。
delete[][] array;
这样的语法可能适用于动态分配数组,以及为什么它不可能实现:int array[ROWS][COLS];
只是程序员的抽象,实际上创建了一个一维数组int array[ROWS*COLS];
。但在编译过程中(当维度大小COLS
和ROWS
必须按标准为常量时),编译器还记住了那些维度的大小,这是必要的,以便稍后使用语法array[x][y] = 45
来寻址元素。编译器知道这个大小,然后使用简单的数学运算将[x][y]
替换为一维数组的相应索引:[COLS*x + y]
。[x][y]
访问符号形式,在编译期间不使用一维符号替换它,而是在运行时稍后替换它。array = new int[ROWS][COLS]
的缺席意味着不需要delete[][] array;
。正如已经提到的那样,它不能用于删除您的“多维”数组,因为您的子数组(附加维度)是分别分配的(使用单独的new
调用),因此它们独立于包含它们的顶部数组(array_2D
),并且它们都无法同时被删除。delete[] 适用于任何非标量(数组)。
您可以使用包装类来完成所有这些操作。 使用“原始”数据类型通常不是一个好的解决方案(数组应该封装在一个类中)。例如,std::vector就是一个非常好的例子。
删除应该被调用与new被调用的次数完全相同。因为你不能调用“a = new X[a][b]”,你也不能调用“delete [][]a”。
从技术上讲,这是一个很好的设计决策,防止整个n维矩阵的奇怪初始化出现。
我认为这很容易实现,但太危险了。可以轻松判断指针是否由new[]
创建,但很难判断new[]...[]
(如果允许)。