C++ std::bad_alloc 例外

Naila Saad Siddiqui 2023年10月12日
  1. C++ での例外処理
  2. C++ の std::bad_alloc 例外
C++ std::bad_alloc 例外

この短い記事では、C++ での std::bad_alloc() 例外の主な原因について説明します。 また、C++ 例外処理を使用して、この実行時例外にスムーズに取り組む方法についても説明します。

C++ での例外処理

すべての例外は std::exception クラスから派生します。 これは修正可能な実行時エラーです。

例外を処理しない場合、プログラムは失敗のメッセージを出力して終了します。 実行制御は、例外のおかげで、プログラムのある部分から別の部分に移すことができます。

C++ では、trycatch、および throw の 3つのキーワードを使用して、例外を処理します。

キーワード 説明
throw throw キーワードを使用して例外をスローし、問題を引き起こす可能性のあるコードの部分がある場合に発生する可能性のある例外の種類を定義します。
try エラーを発生させる可能性があり、例外をスローする必要があるコード セグメントは、try ブロックに含まれています。
catch 例外がスローされたときに呼び出されるブロックは、catch ブロックと呼ばれます。 必要に応じて、アプリケーションをプログラムで停止し、このコード ブロックの誤りをユーザーに通知できます。

C++ の std::bad_alloc 例外

new キーワードを使用してオブジェクトを作成しようとするたびに、コンパイラはヒープ上のメモリを要求します。 必要な量のメモリがヒープで利用できない場合、std::bad_alloc 例外として知られる例外がスローされます。

new キーワードまたは動的配列を使用して単一のオブジェクトを宣言すると、必要なメモリが利用できない場合、実行時に例外がスローされます。

以下の例を見て、bad_alloc 例外を処理してみましょう。

コード例:

#include <iostream>
#include <new>

int main() {
  try {
    int* newarr = new int[2000000000];
  } catch (std::bad_alloc& all) {
    std::cerr << "bad_alloc exception occurred: " << all.what() << '\n';
  }
  return 0;
}

出力:

bad_alloc exception occurred: std::bad_alloc

このコードを try-catch ブロックで囲まないと、プログラムがクラッシュする可能性があります。 このような状況を回避するには、ユーザーにエラーを通知してプログラムを正常に終了できるように、常にこの例外を処理する必要があります。

関連記事 - C++ Error