这种解除分配是否正确?

4 c++ memory-management

我有一个3x3 2D动态数组分配如下:

int** matrix = new int* [3];
matrix[0] = new int [3*3];
for (int i = 1; i < 3; ++i)
    matrix[i] = matrix[i-1] + 3;
Run Code Online (Sandbox Code Playgroud)

我应该如何解除分配?它是否正确:

delete [] matrix;

delete [] matrix[0];
Run Code Online (Sandbox Code Playgroud)

或者我也应该删除matrix[1],[2]

Dim*_*ima 8

你拥有它的方式,你应该:

delete [] matrix[0];
delete [] matrix;
Run Code Online (Sandbox Code Playgroud)

但这是分配动态2D阵列的非常规方式.通常,您分配一个指针数组,然后为每一行(列)分配一个实际类型的数组.

// allocate
int **matrix = new int*[3];
for(int i = 0; i &lt 3; ++i)
  matrix[i] = new int[3];

// deallocate
for(int i = 0; i &lt 3; ++i)
  delete [] matrix[i];

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

  • 实际上,这是分配2D数组的一种非常常见的方式.它确保矩阵中的所有数据在存储器中是连续的,并且对于足够大的矩阵,更有效. (3认同)

kma*_*rsh 6

对于每个新的,你需要删除一个新的,与新的相反.


小智 6

代码:

delete [] matrix;
delete [] matrix[0];
Run Code Online (Sandbox Code Playgroud)

显然是错误的,因为你删除它后使用矩阵.

delete [] matrix[0];
delete [] matrix;
Run Code Online (Sandbox Code Playgroud)

是正确的,但我不能保证整个代码做一些合理的事情.

请注意,您不应删除矩阵[1]和矩阵[2],因为它们只是矩阵[0]的副本.根据经验,您应该在调用new时具有相同数量的删除调用.