我有一个动态分配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;
}
由于
答案 0 :(得分:2)
没有魔力))你对数组中的一个元素进行了复制。现在您可以修改数组甚至删除它......您的副本将是永久性的。但是,如果你将一个指针保存到数组的一个元素,然后删除一个数组,你就会遇到麻烦:
int * pElement = & matrix[ i ][ j ];
deleteMatrix();
int x = *pElement; // bad
答案 1 :(得分:0)
您提供给我们的信息是:
int result = matrix[i][j]
,正如您所说,它存储在堆栈中。你没有返回数组。你正在返回在数组的[i][j]
找到的int,所以这是非常好的有效代码。
如果你有
int** result = matrix;
delete matrix;
// ...
int i = result[5][3];
这会导致未定义的行为。由于您的功能已释放内存,因此可能存在任何内容。如果没有任何东西踩在内存上,它可能看起来很完美,或者它可能完全被破坏了。