「new」が例外をスローした場合、オブジェクトは割り当てられません(「new」の前に行われた割り当ては、割り当てを解除する必要があります。そうしないと、メモリが浸出することに注意してください)。
コンストラクタはエラーコードを返すことができないため、例外はエラーシステムとして使用されると考えられます。
myclass::myclass()
{
param1 = new type1(); //successfull
try
{
param2= new type2(); //may fail
}
(...)
{
delete param1; //need to deallocate
}
}
これは少しやり過ぎです。コンストラクターに例外がまったくないことを好みます。例外をスローできるよりも、コンストラクターを使用してフレームオーク全体を作成する人もいます。
とにかく、アロケータの他のバグは以下を引き起こす可能性があります:
セグメンテーション違反(範囲外の値へのアクセス)
ヒープの破損(メモリ範囲内にあるが、オブジェクトによって技術的に所有されていないデータを上書きする)
無限ループ(プログラムを外部で中止する必要があります。そうしないと、アロケータを終了しません)。
もちろん、これらは通常のコードでも発生する可能性のある主要な問題です。ただし、デフォルトのアロケータは問題を引き起こさず、少なくとも「メモリ不足」の例外をスローする可能性があります。十分なRAMがない場合。