bool primeNums[100000000];
stack
したがって、巨大なサイズの静的配列を割り当てるのに十分なスタック領域がないため、セグメンテーション違反が発生します。
に動的配列が割り当てられているheap
ため、セグメンテーション違反が発生するのはそれほど簡単ではありません。動的配列はnew
C++ を使用して作成され、メモリを割り当てるために呼び出しoperator new
、次にコンストラクタを呼び出して割り当てられたメモリを初期化します。
どのように機能するかについての詳細operator new
は、以下の標準から引用されています [new.delete.single]:
必要な動作:
適切にアラインされたストレージ (3.7.3) への非 null ポインターを返すか、bad_alloc 例外をスローします。この要件は、この機能の代替バージョンを拘束します。
デフォルトの動作:
— ループの実行: ループ内で、関数は最初に要求されたストレージの割り当てを試みます。この試みが標準 C ライブラリ関数 malloc の呼び出しを伴うかどうかは未規定です。
— 試行が成功した場合、割り当てられたストレージへのポインタを返します。それ以外の場合、set_new_handler() への最後の引数がヌル ポインターであった場合は、bad_alloc をスローします。
— それ以外の場合、関数は現在の new_handler (18.4.2.2) を呼び出します。呼び出された関数が戻ると、ループが繰り返されます。
— 要求されたストレージの割り当てが成功した場合、または呼び出された new_handler 関数が返されなかった場合、ループは終了します。
したがって、動的配列をnew
で使用すると、十分なスペースがないbad_alloc
場合、デフォルトでスローされます。この場合、セグメンテーション違反ではなく例外が表示されます。配列サイズが巨大な場合は、動的配列または標準コンテナーを使用することをお勧めします。ベクターなど。