我有一个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]
答案 0 :(得分:8)
你拥有它的方式,你应该:
delete [] matrix[0];
delete [] matrix;
但这是分配动态2D阵列的非常规方式。通常你分配一个指针数组,然后为每一行(列)分配一个实际类型的数组。
// allocate
int **matrix = new int*[3];
for(int i = 0; i < 3; ++i)
matrix[i] = new int[3];
// deallocate
for(int i = 0; i < 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}
然后呢 删除[]矩阵以删除矩阵本身。
希望这会有所帮助。 感谢