1. ホーム
  2. c++

[解決済み] std::bad_alloc' のインスタンスを投げた後、なぜ terminate するのですか?

2022-01-30 04:45:23

質問

1秒に1回、関数が動作する。
私のシステムはリナックスです。 ランが突然死ぬ。

    -----global-------
    static int arrayNum[33000];
    -------------------
function(){
    unsigned short int**  US_INT;
    US_INT= new unsigned short int*[255];
            for(int i = 0; i < 255; i++)
            {
                US_INT[i] = new unsigned short int[128];
                memset(US_INT[i], 0, sizeof(unsigned short int) * 128);
            }
    double x;
    double y;
    int cnt= 0;  
            int nArrayCount=0;
          for(int i = 0; i < 255; i++)
            {

                for(int j=0;j<128;j++){

                    x=j;
    y=cnt
                    nArray[nArrayCount]=US_INT[i][j];

                    nArrayCount++;

                }
                cnt=cnt+(256/255); 

            }


     for(int i = 0; i < 255; i++)
            {
                delete US_INT[i];
            }

            delete[] US_INT;
}

プログラム停止とメッセージ↓。 std::bad_alloc' のインスタンスを投げた後に呼び出されたターミネート what(): std::bad_alloc

解決方法は?

その bad_alloc 例外は、メモリの割り当てに失敗した場合に発生します (したがって、あなたの new ). terminate() が自動的に呼び出されるのは、この例外をキャッチしていないからです。

bad_allocの根本的な原因は、十分なメモリがない(またはフリーストアが破損している)ことです。例えば、あるループで繰り返しメモリの解放に失敗すると、このようなことが起こります。

実際、あなたのコードでは、配列の削除が正しく行われていないように見えます。 US_INT[i] . を使用する必要があります。 delete[]US_INT[i] . として 原則 を使用するたびに new[] を使用しなければなりません。 delete[] .

追伸 を選ぶこともできます。 ベクター 配列の代わりに、メモリ不足の問題から解放されます。