【问题标题】:Heap Corruption Detected?检测到堆损坏?
【发布时间】:2014-06-13 21:07:43
【问题描述】:
void allocateTriangle(int ** & twoDArray, int numRows);

void printTriangle(int ** twoDArray, int numRows);

void growToSquare(int ** & twoDArray, int numRows);

void printSquare(int ** & twoDArray, int numRows);

using namespace std;

int main(int argc, char ** argv){

    srand((unsigned int)time(NULL));

    int ** twoDArray;
    int numRows = 10;
    allocateTriangle(twoDArray, numRows);
    cout << "******* Triangle array *******" << endl;
    printTriangle(twoDArray, numRows);
    growToSquare(twoDArray, numRows);
    cout << "******* Sqaure array *******" << endl;
    printSquare(twoDArray, numRows);

    return 0;
}    

void allocateTriangle(int ** & twoDArray, int numRows) {
    twoDArray = new int*[numRows];

    for (int x = 0; x < numRows; x++){
        twoDArray[x] = new int[x];
        for (int y = 0; y <= x; y++){
            twoDArray[x][y] = rand() % 100;
        }
    }
}
void printTriangle(int ** twoDArray, int numRows){
    for (int x = 0; x < numRows; x++){
        for (int y = 0; y <= x; y++){
            cout << setw(5);
            cout << twoDArray[x][y];
        }
    cout << endl;
    }
}

void growToSquare(int ** & twoDArray, int numRows) {

    for (int x = 0; x < numRows; x++){
        int *tempArray = new int[x];
        *tempArray = *twoDArray[x];
-->     delete [] twoDArray[x];
        twoDArray[x] = new int[numRows];

        for (int y = 0; y < numRows; y++){
            if (y <= x)
                twoDArray[x][y] = tempArray[y];
            else
                twoDArray[x][y] = rand() % 100;
        }
    }
}
void printSquare(int ** & twoDArray, int numRows){
    for (int x = 0; x < numRows; x++){
        for (int y = 0; y <= numRows; y++){
            cout << setw(5);
            if (y <= x)
                cout << twoDArray[x][y];
            else if (y - 1 == x) 
                cout << " ";
            else
                cout << twoDArray[x][y - 1];
        }
        cout << endl;
    }
}

箭头指向这个程序喜欢崩溃的地方。给我一个堆损坏,我在过去的 6 个小时里都在看这个和其他帖子,我什么也没得到。

主要是 growToSquare(),当我尝试通过删除和分配再次“调整”二维数组的大小时,它会在删除时停止。我已经注释掉了其他代码行,看看是否有其他东西在触发,nada。

有什么建议吗? (我使用的是 Visual Studio 2013)

【问题讨论】:

  • a) 你删除[]分配的东西在哪里?
  • 向下滚动代码,我在它旁边放了一个箭头。
  • 这还不是全部。抱歉听起来很刺耳,但如果您不能正确使用原始指针,请使用 std::vector。使您当前的任务(调整大小等)也更容易解决。

标签: c++ visual-studio multidimensional-array heap-corruption


【解决方案1】:

WhozCraig 在上面的评论中发现了这一点。

  • y &lt;= x 应该是 y &lt; x,在这段代码的多个位置。 – WhozCraig

为了简单起见,假设numRows 在这里是1。遵循那个简单案例中的代码逻辑。

void allocateTriangle(int ** & twoDArray, int numRows) {
    twoDArray = new int*[numRows];

    for (int x = 0; x < numRows; x++){
        twoDArray[x] = new int[x];
        for (int y = 0; y <= x; y++){
            twoDArray[x][y] = rand() % 100;
        }
    }
}

这是将要执行的代码,它分配给一个长度为零的数组。

    twoDArray = new int*[1];

        twoDArray[0] = new int[0];

            twoDArray[0][0] = rand() % 100;

内存现已损坏。


三角形分配的合理解决方案

虽然有大约六种不同的方法来计算指数,但这种方法可能是最容易理解的。

void allocateTriangle(int ** & twoDArray, int numRows)
{
    twoDArray = new int*[numRows];
    for (int x = 0; x < numRows; x++)
    {
        twoDArray[x] = new int[x+1]; // NOTE: size
        for (int y = 0; y <= x; y++)
            twoDArray[x][y] = rand() % 100;
    }
}

void printTriangle(int ** twoDArray, int numRows)
{
    for (int x = 0; x < numRows; cout << endl, ++x)
        for (int y = 0; y <= x; y++)
            cout << setw(5) << twoDArray[x][y];
}

这使您可以(大部分)保持索引,同时将分配调整为适当的长度。


将三角形变成正方形

类似地,以下内容会将您的三角形扩展为正方形。注意:您可以在已经扩展到正方形的东西上调用它。这样做时它会简单地重新随机生成右半对角线(而且相当昂贵)。

void growToSquare(int ** & twoDArray, int numRows)
{
    for (int x = 0; x < numRows; x++)
    {
        int *tempArray = new int[numRows];
        for (int y=0; y<=x; ++y)
            tempArray[y] = twoDArray[x][y];
        for (int y=x+1; y<numRows; ++y)
            tempArray[y] = rand() % 100;
        delete [] twoDArray[x];
        twoDArray[x] = tempArray;
    }
}

void printSquare(int ** & twoDArray, int numRows)
{
    for (int x = 0; x < numRows; cout << endl, ++x)
        for (int y = 0; y < numRows; y++)
            cout << setw(5) << twoDArray[x][y];
}

输出

使用上述方法,您的输出将如下所示。显然随机性会产生不同的值,但重要的是正方形的左下部分保留了原来的三角形。

******* Triangle array *******
   80
   80    1
   45   93   28
   19   96   90    7
   38   70   23   26   98
   97   26   98   48   37   97
   77   25   43    0   28   84   90
   95   78   48   16   23   30   14   64
   14   29   83   60    7   83   14   77   94
   79    1   43   55   22   14   80   34   40   53
******* Sqaure array *******
   80   10   62   17   62   94   62   47   87    3
   80    1   56   67   56   91   85   51   25    8
   45   93   28    9   42   57   95   56   19   42
   19   96   90    7   46   67   42   77   53   73
   38   70   23   26   98   53   22   34   69    3
   97   26   98   48   37   97    8   18   53   55
   77   25   43    0   28   84   90    7   82   43
   95   78   48   16   23   30   14   64   94   33
   14   29   83   60    7   83   14   77   94   75
   79    1   43   55   22   14   80   34   40   53

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 2018-03-26
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多