堆栈上的c ++存储保存在堆栈上

时间:2013-05-07 05:25:26

标签: c++ stack heap

我有一个动态分配2D数组的代码,用于某些计算,然后将其放在堆栈上名为result的变量上并释放2D数组。我想知道为什么这样做,并且这样做是一个很好的编程实践,而不是有一个可以在以后解除分配的全局2D数组。

{

        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;

}

由于

2 个答案:

答案 0 :(得分:2)

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

int * pElement = & matrix[ i ][ j ];
deleteMatrix();
int x = *pElement; // bad

答案 1 :(得分:0)

您提供给我们的信息是:

  • 你有一个动态分配的2D数组,大概叫做矩阵,你可以在从函数返回之前释放它。
  • 您有代码int result = matrix[i][j],正如您所说,它存储在堆栈中。

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

如果你有

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

这会导致未定义的行为。由于您的功能已释放内存,因此可能存在任何内容。如果没有任何东西踩在内存上,它可能看起来很完美,或者它可能完全被破坏了。

相关问题