1

我的问题来自这个答案。在评论中他提到我应该以相反的顺序删除分配的动态二维数组。但是我不太明白为什么要这样做。这是代码:

//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;

所以我的问题是,这两种取消分配二维数组的方法之间有什么显着差异吗?

4

1 回答 1

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;
于 2013-10-22T04:19:10.070 回答