我的问题来自this回答。 在评论中他提到我应该以相反的顺序删除分配的动态2D数组。 但是我不明白为什么要这样做。这是代码:
//intialising array
int size = 10000;
double **array = new double[size];
for(int i = 0; i < size; i++)
array[i] = new double[size];
//conventional de-initialise
for(int i = 0; i < size; i++)
delete[] array[i];
delete[] array;
//reverse de-initialise
for(int i = size - 1; size >= 0; i--)//notice reverse order here
delete[] array[i];
delete[] array;
所以我的问题是,解除分配2D阵列的两种方法之间有什么显着差异吗?
答案 0 :(得分:0)
在你的例子中没有区别 - 你创建100K指针,然后为每个指针分配内存。如何分配/释放内存并将其分配给指针数组无关紧要。
但是你的问题是关于为什么反向重新分配在另一篇文章中,并且与你的例子相反它很重要 - 当新的内存分配失败时,计数器变量被重用于从最后分配的对象倒计时到0。如果取消分配其他方向,则需要其他变量:
try
{
array = new double*[size];
// Don't shadow counter here.
for(counter = 0; counter < size; counter++)
{
array[counter] = new double[size];
}
}
catch(std::bad_alloc)
{
// delete in reverse order to mimic other containers.
for(--counter; counter >= 0;--counter)
{
delete[] array[counter];
}
delete[] array;