0

我有一个代码,它动态分配一个二维数组,将它用于一些计算,然后将它放到堆栈上一个名为 result 的变量上并释放二维数组。我想知道为什么这样做有效,这样做是否是一种很好的编程实践,而不是拥有一个可以在以后释放的全局二维数组。

{

        int *matrix = new int[5];

        for(row = 0; row<array_size+1;row++)
        {
            subSolution[row] = new (nothrow) int[request+1];
            if(subSolution[row] == NULL)
               return -1;
        }
        //do some stuff

        result = subSolution[1][request];

        for(row = 0; row<array_size+1; row++ )
            delete [] subSolution[row];

        delete [] subSolution;

        return result;

}

谢谢

4

2 回答 2

2

没有魔法))您复制了数组的一个元素。现在您可以修改数组甚至删除它...您的副本将是永久的。但是如果你保存一个指向数组一个元素的指针,然后删除一个数组,你就会遇到麻烦:

int * pElement = & matrix[ i ][ j ];
deleteMatrix();
int x = *pElement; // bad
于 2013-05-07T05:40:56.710 回答
0

您给我们的信息是:

  • 你有一个动态分配的二维数组,大概称为矩阵,你说你在从函数返回之前释放了它。
  • 你有代码int result = matrix[i][j],正如你所说,它存储在堆栈中。

你没有返回数组。您正在返回在[i][j]数组中找到的 int,所以这是非常好的有效代码。

如果你有

int** result = matrix;
delete matrix;
// ...
int i = result[5][3];

这将导致未定义的行为。由于你的函数已经释放了内存,所以它的位置可能有任何东西。如果内存上没有任何东西,它可能看起来很完美,或者它可能完全损坏。

于 2013-05-07T05:46:23.963 回答