这种解除分配是否正确?

时间:2009-06-11 19:49:38

标签: 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;

我应该如何解除分配?这是对的:

delete [] matrix;

delete [] matrix[0];

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

6 个答案:

答案 0 :(得分:8)

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

delete [] matrix[0];
delete [] matrix;

但这是分配动态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;

答案 1 :(得分:6)

每个新的都需要删除一个,与新的相反。

答案 2 :(得分:6)

代码:

delete [] matrix;
delete [] matrix[0];

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

delete [] matrix[0];
delete [] matrix;

是正确的,但我不能保证代码整体做了明智的事情。

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

答案 3 :(得分:4)

您需要阅读:http://isocpp.org/wiki/faq/freestore-mgmt#multidim-arrays

简而言之,如果矩阵为矩形,则将矩阵分配在一个块中:

int* matrix = new int[3*3];

for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j)
        matrix[i*3+j] = x;

delete [] matrix;

由于它分配在一个块中,您也可以在一个块中删除。

或者你可以做类似于你正在做的事情,但为每一行做一个分配。请务必先删除每一行,然后删除矩阵。

链接文章还有关于在类中包装讨厌的指针/数组内容的信息。

答案 4 :(得分:1)

指针数组可能是不必要的。您可以只分配9个元素的1D数组,并进行数学运算以将2D索引转换为1D索引。

除了交换delete[]操作外,您还应该考虑分配失败时会发生什么。如果第二次分配抛出std::bad_alloc,则程序会从第一次分配中泄漏内存。正确编写的矩阵类(由Fred Larson建议)将为您处理内存释放。

答案 5 :(得分:-1)

矩阵数组中的每个元素都是一个int [],除此之外,矩阵本身是一个int *(int * [])数组,考虑到这些规则你应该做的

delete [] matrix [i] {i = 0,1,2}

然后呢 删除[]矩阵以删除矩阵本身。

希望这会有所帮助。 感谢