正确删除2D数组?

时间:2013-10-22 03:26:31

标签: c++ arrays memory memory-management

我的问题来自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阵列的两种方法之间有什么显着差异吗?

1 个答案:

答案 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;