ヒープの破損が検出されましたか?

コードEyez
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()に到達し、削除と割り当てによって2D配列の「サイズを変更」しようとすると、削除で停止します。他の何かがトリガーされているかどうかを確認するために、コードに他の行をコメントアウトしました、灘。

何かアドバイスはありますか?(私はVisual Studio 2013を使用しています)

ドリュー・ドーマン

上記のコメントで、WhozCraigはそれを発見しました。

  • y <= xy < 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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ヒープの破損が検出されました| C

分類Dev

ヒープ破損が検出されましたMalloc()Free()

分類Dev

ヒープ破損が検出されました-iPhone5Sのみ

分類Dev

エラーc ++アサーションの失敗ヒープの破損が検出されました

分類Dev

ヒープの破損により、C ++でエラーが検出されました

分類Dev

デバッグエラー:ヒープの破損が検出されました

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

通常のブロック後にヒープの破損が検出されました(#181)

分類Dev

ヒープの破損が検出されました:通常のブロック後(#176)

分類Dev

通常のブロック #63 の後にヒープ破損が検出されました

分類Dev

デストラクタでヒープの破損が検出されました

分類Dev

クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

分類Dev

文字列を削除した後、C ++でヒープ破損が検出されました

分類Dev

C-アレイを解放するときにヒープ破損が検出されました

分類Dev

iOSエラー:ヒープの破損が検出され、空きリストが破損し、ガード値が正しくありません:0

分類Dev

検出されたヒープ破損:通常のブロック後()

分類Dev

shared_ptrが破棄されたときのヒープの破損

分類Dev

free()の呼び出しでヒープが破損した理由は何ですか?

分類Dev

ヒープからの割り当て中に重大なエラーが検出されました

分類Dev

glibcが検出されました-ダブルフリーまたは破損(!prev)

分類Dev

スタックの破損が検出され、dalvikVMがクラッシュしました

分類Dev

Cのヒープが破損していて、理由がわかりません

分類Dev

newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

分類Dev

c ++プログラムの実行時にヒープが破損しましたエラー

分類Dev

破損したヒープをクリーンアップできますか?

分類Dev

EPPlus-テンプレートの使用時に保存されたファイルが破損しました

分類Dev

c ++ delete [] 2D配列によりヒープが破損しました

分類Dev

C ++の多重継承とアップキャストされたスマートポインターの破壊により、VS2017でヒープが破損します

Related 関連記事

  1. 1

    ヒープの破損が検出されました| C

  2. 2

    ヒープ破損が検出されましたMalloc()Free()

  3. 3

    ヒープ破損が検出されました-iPhone5Sのみ

  4. 4

    エラーc ++アサーションの失敗ヒープの破損が検出されました

  5. 5

    ヒープの破損により、C ++でエラーが検出されました

  6. 6

    デバッグエラー:ヒープの破損が検出されました

  7. 7

    C ++:通常のブロック後にヒープの破損が検出されました

  8. 8

    C ++:通常のブロック後にヒープの破損が検出されました

  9. 9

    通常のブロック後にヒープの破損が検出されました(#181)

  10. 10

    ヒープの破損が検出されました:通常のブロック後(#176)

  11. 11

    通常のブロック #63 の後にヒープ破損が検出されました

  12. 12

    デストラクタでヒープの破損が検出されました

  13. 13

    クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

  14. 14

    文字列を削除した後、C ++でヒープ破損が検出されました

  15. 15

    C-アレイを解放するときにヒープ破損が検出されました

  16. 16

    iOSエラー:ヒープの破損が検出され、空きリストが破損し、ガード値が正しくありません:0

  17. 17

    検出されたヒープ破損:通常のブロック後()

  18. 18

    shared_ptrが破棄されたときのヒープの破損

  19. 19

    free()の呼び出しでヒープが破損した理由は何ですか?

  20. 20

    ヒープからの割り当て中に重大なエラーが検出されました

  21. 21

    glibcが検出されました-ダブルフリーまたは破損(!prev)

  22. 22

    スタックの破損が検出され、dalvikVMがクラッシュしました

  23. 23

    Cのヒープが破損していて、理由がわかりません

  24. 24

    newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

  25. 25

    c ++プログラムの実行時にヒープが破損しましたエラー

  26. 26

    破損したヒープをクリーンアップできますか?

  27. 27

    EPPlus-テンプレートの使用時に保存されたファイルが破損しました

  28. 28

    c ++ delete [] 2D配列によりヒープが破損しました

  29. 29

    C ++の多重継承とアップキャストされたスマートポインターの破壊により、VS2017でヒープが破損します

ホットタグ

アーカイブ