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

ヴィクラムシン

次のコードがあり、クラスのコンストラクターで3つのint *にメモリを割り当てています。そして、後でクラスのデストラクタで削除します。デストラクタでint *の2つを削除する際に問題が発生しました(問題が発生している以下のコードにコメントを入れました):

#define CAP 3
class SetOfStacks
{
private:
    int* a1;
    int* a2;
    int* a3;
    int index = -1;
public:
    void push(int data);
    SetOfStacks()
    {
        a1 = new int[CAP];
        a2 = new int[CAP];
        a3 = new int[CAP];
    }
    ~SetOfStacks()
    {
        delete [] a1; //This works just fine
        delete [] a2; //heap corruption here
        delete [] a3; //heap corruption here
    }
};

void SetOfStacks::push(int data)
{
    if (index >= 3 * CAP)
    {
        cout << "stack overflow" << endl;
        return;
    }
    if(index>=-1 && index<=1)
    {
        index++;
        a1[index] = data;
    }
    else if (index >1  && index<=4)
    {
        index++;
        a2[index] = data;
    }
    else if (index >4 && index<=7)
    {
        index++;
        a3[index] = data;
    }
}


int main()
{
    SetOfStacks s;
    s.push(10);
    s.push(20);
    s.push(30);;
    s.push(40);
    s.push(50);
    s.push(60);
    s.push(70);
    s.push(80);
    s.push(90);

    return 0;
}

コードを何度もデバッグしましたが、delete [] a2とdelete [] a3を実行すると、なぜHEAPCORRUPTIONが発生するのかわかりません。delete [] a1の実行は問題なく機能します。delete [] a2とdelete [] a3で次のエラーが発生します。

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

このエラーが発生する理由とその原因を知っていますか(a1の削除が正常に機能する理由がわかりませんが、a2とa3を削除すると、コード内でほぼ同じロジックが実行されますが、このエラーが発生します)。

Jan Schultke

すべての配列の長さCAP3(ifステートメントで判断して)ですが、配列に書き込むときにインデックスを相対化することはありません。

    else if (index >4 && index<=7)
    {
        index++;
        a3[index] = data;
    }

これらの行では8、配列までのインデックスを書き込むことができますこれがエラーが発生する理由です。

CRTは、ヒープバッファの終了後にアプリケーションがメモリに書き込んだことを検出しました。

を使用してインデックスに書き込むときにモジュロ演算子を使用すると、これを修正できますindex % CAPこれが任意CAPので適切に機能するためには、ifステートメントも>= N * CAP境界として使用する必要があります

   else if (index >= 2 * CAP) // no upper check needed in an if-else chain
    {
        a3[index++ % CAP] = data; // you can also do index++ after
    }

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

ヒープ内のオブジェクトに対してC ++デストラクタが呼び出されるのはいつですか?

分類Dev

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

分類Dev

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

分類Dev

Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

分類Dev

SWIGを使用してPython用にラップされたC ++クラスを印刷するときに__str __()が呼び出されない

分類Dev

C ++でコピーコンストラクターが呼び出されるのはいつですか?オブジェクトを別のオブジェクトに割り当てるときに呼び出されませんか?

分類Dev

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

分類Dev

自動生成されたc#クライアントは、さまざまなタイプを返すことができるAPI呼び出しをどのように処理することになっていますか?

分類Dev

GetAsyncKeyState関数が呼び出された後に入力を検出しないようにしますか?C ++

分類Dev

呼び出された中止-破損したサイズとcのprev_sizeエラー

分類Dev

「-c」引数を指定して呼び出されたときにurxvtcがzsh関数にアクセスしないのはなぜですか?

分類Dev

node.jsでC ++と.Netの混合dllを使用するにはどうすればよいですか?(エラー:abort()が呼び出されました)

分類Dev

Xcode [c ++]でassert(assert.h)内のラムダを定義しているときに、関数のようなマクロ呼び出しのコンパイルエラーに提供される引数が多すぎます

分類Dev

メソッドを呼び出して戻り値を配列に割り当てるとき、メソッドが呼び出されたときにC#が配列参照を使用するのはなぜですか?

分類Dev

cmd.exe / Cを介して呼び出されたときに、動作するcmdコマンドが正しく実行されない

分類Dev

golangがcgoを使用してcライブラリを呼び出すときに、sanitizer-leakが検出されない

分類Dev

基本クラスのフレンド関数が、プライベートであるにもかかわらず、派生クラスのオーバーライドされた仮想関数をどのように呼び出しているか?(C ++)

分類Dev

C#Backgroundworkは、例外がスローされたときにe.Errorを呼び出しません

分類Dev

無限ループのときにC#経由で呼び出されたPythonが値を返さない

分類Dev

メソッドの「this」として別のクラスを使用して、クラス内に格納されているメソッドを呼び出すためのC ++の正しい構文は何ですか?

分類Dev

配列 C の割り当て時にスタック破壊が検出されました

分類Dev

エラーclangの取得:エラー:ターミナルからC ++ファイルをコンパイルしているときに、リンカーコマンドが終了コード1で失敗しました(呼び出しを確認するには-vを使用してください)。

分類Dev

c#動的に作成されたボタンの名前を設定して、後で呼び出すことができるようにします

分類Dev

ネットワークインターフェイスがC ++を使用してプログラムでインターネットに接続されていることをどのように検出できますか?

Related 関連記事

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

    ヒープ内のオブジェクトに対してC ++デストラクタが呼び出されるのはいつですか?

  7. 7

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

  8. 8

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

  9. 9

    Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

  10. 10

    SWIGを使用してPython用にラップされたC ++クラスを印刷するときに__str __()が呼び出されない

  11. 11

    C ++でコピーコンストラクターが呼び出されるのはいつですか?オブジェクトを別のオブジェクトに割り当てるときに呼び出されませんか?

  12. 12

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

  13. 13

    自動生成されたc#クライアントは、さまざまなタイプを返すことができるAPI呼び出しをどのように処理することになっていますか?

  14. 14

    GetAsyncKeyState関数が呼び出された後に入力を検出しないようにしますか?C ++

  15. 15

    呼び出された中止-破損したサイズとcのprev_sizeエラー

  16. 16

    「-c」引数を指定して呼び出されたときにurxvtcがzsh関数にアクセスしないのはなぜですか?

  17. 17

    node.jsでC ++と.Netの混合dllを使用するにはどうすればよいですか?(エラー:abort()が呼び出されました)

  18. 18

    Xcode [c ++]でassert(assert.h)内のラムダを定義しているときに、関数のようなマクロ呼び出しのコンパイルエラーに提供される引数が多すぎます

  19. 19

    メソッドを呼び出して戻り値を配列に割り当てるとき、メソッドが呼び出されたときにC#が配列参照を使用するのはなぜですか?

  20. 20

    cmd.exe / Cを介して呼び出されたときに、動作するcmdコマンドが正しく実行されない

  21. 21

    golangがcgoを使用してcライブラリを呼び出すときに、sanitizer-leakが検出されない

  22. 22

    基本クラスのフレンド関数が、プライベートであるにもかかわらず、派生クラスのオーバーライドされた仮想関数をどのように呼び出しているか?(C ++)

  23. 23

    C#Backgroundworkは、例外がスローされたときにe.Errorを呼び出しません

  24. 24

    無限ループのときにC#経由で呼び出されたPythonが値を返さない

  25. 25

    メソッドの「this」として別のクラスを使用して、クラス内に格納されているメソッドを呼び出すためのC ++の正しい構文は何ですか?

  26. 26

    配列 C の割り当て時にスタック破壊が検出されました

  27. 27

    エラーclangの取得:エラー:ターミナルからC ++ファイルをコンパイルしているときに、リンカーコマンドが終了コード1で失敗しました(呼び出しを確認するには-vを使用してください)。

  28. 28

    c#動的に作成されたボタンの名前を設定して、後で呼び出すことができるようにします

  29. 29

    ネットワークインターフェイスがC ++を使用してプログラムでインターネットに接続されていることをどのように検出できますか?

ホットタグ

アーカイブ