为什么"删除[] [] ...... multiDimensionalArray;" C++中的operator不存在

m_p*_*tor 22 c++ arrays

我总是想知道是否有用于删除标准C++语言中的多维数组的运算符.

如果我们创建了一个指向单维数组的指针

int *array = new int[size];
Run Code Online (Sandbox Code Playgroud)

删除看起来像:

delete [] array;
Run Code Online (Sandbox Code Playgroud)

那很棒.但如果我们有二维数组,我们就做不到

delete [][] twoDimenstionalArray;
Run Code Online (Sandbox Code Playgroud)

相反,我们应该循环和删除项目,就像在这个例子中一样.

谁能解释为什么?

Dan*_*ein 25

从技术上讲,C++中没有二维数组.您作为二维数组使用的是一维数组,每个元素都是一维数组.由于技术上不存在,C++无法删除它.


Gre*_*ers 20

因为没办法打电话

int **array = new int[dim1][dim2];
Run Code Online (Sandbox Code Playgroud)

所有新闻/删除都必须平衡,因此对delete [][]运营商没有意义.

new int[dim1][dim2]返回指向dim1类型大小的数组的指针int[dim2].所以dim2必须是编译时常量.这类似于在堆栈上分配多维数组.


KPe*_*xEA 7

在该示例中多次调用delete的原因是因为new也被多次调用.必须为每个新的调用删除.

例如,如果我分配1,000,000字节的内存,我以后不能删除200,000 - 300,00中的条目,它被分配为一个整块,必须作为一个整块释放.

  • 因此,对等也是如此,如果它被分配为多个块,则它必须被释放为多个块 (2认同)

小智 6

你必须循环的原因,就像你提到的例子一样,编译器/分配器不知道需要删除的数组的数量.

当您分配二维数组时,您确实创建了N个一维数组.现在每个都必须删除,但系统不知道有多少.顶级数组的大小,即指向二级数组的指针数组,就像C中的任何其他数组一样:系统不存储它的大小.

因此,没有办法delete [][]按照您的描述实现(不会显着改变语言).