C++ c++;存储在堆上存储在堆栈上

C++ c++;存储在堆上存储在堆栈上,c++,stack,heap,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[

我有一个代码,它动态分配一个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;

}
{
int*矩阵=新的int[5];
对于(row=0;row没有魔法))您对数组的一个元素进行了复制。现在您可以修改数组,甚至删除它…您的复制将是永久的。但是如果您将指针保存到数组的一个元素,然后删除数组,您将遇到以下问题:

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

您提供给我们的信息是:

  • 您有一个动态分配的2D数组,可能称为matrix,您在从函数返回之前会说它是空闲的
  • 您的代码是
    intresult=matrix[i][j]
    ,正如您所说,它存储在堆栈上
您没有返回数组。您返回的是在数组的
[i][j]
中找到的int,因此这是非常好的有效代码

如果你有

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

这将导致未定义的行为。由于函数已释放内存,因此内存中可能有任何内容。如果内存中没有任何内容,则它可能看起来很完美,或者可能已完全损坏。

我强烈建议您显示一些您正在做的事的代码,因为您可能会获得否决票,因为至少你说的不太可能。我之所以认为这是一个糟糕的编程实践,是因为它可能会导致潜在的崩溃。假设我使用memcpy而不是上面的结果中的=。因此,我可能会覆盖函数堆栈的一部分。我不确定在运行时,它是否会在执行memcpy后崩溃。可能在尝试之后要访问堆栈上的其他内容?Aaaa…Mmmmmm…有两种变体:(1)我的英语很差,所以我无法理解你的评论(2)你的评论毫无意义…你能重新措辞一个问题吗?