上級のC++エラー 27問
9種類のエラーを、それぞれ複数パターンずつ収録しています。
- free(): double free detected の原因と直し方(C++のdelete)newで確保したメモリに対してdeleteを2回呼んでしまったときに出る実行時エラーです。メモリ管理システムが不整合を検知してプロセスを強制終了させます。
- new[]とdeleteの不一致が「たまたま動いてしまう」危険性new[]で確保した配列に対して、delete[]ではなく単体用のdeleteを使ってしまう不一致です。未定義動作であるにもかかわらず、int型のような単純な配列ではクラッシュせずに動いてしまうことがあります。
- ローカル変数への参照を返すとSegmentation faultになる原因関数のローカル変数への参照を関数の外に返してしまうバグです。関数を抜けた時点でローカル変数の実体は破棄されるため、返された参照は存在しないメモリを指すことになります。
- delete後のポインタ使用が「たまたま動いてしまう」危険性deleteした直後の同じポインタを使って読み書きしてしまうバグです。未定義動作であるにもかかわらず、解放直後のメモリはすぐには再利用されないことが多く、正しい値が読めてしまうことがあります。
- 仮想デストラクタが無いと派生クラスのデストラクタが呼ばれない理由基底クラスのポインタ経由で派生クラスのオブジェクトをdeleteしたとき、基底クラスのデストラクタが仮想(virtual)でないと、派生クラス側のデストラクタが呼ばれないバグです。
- 派生クラスを値渡しすると情報が失われるオブジェクトスライシング派生クラスのオブジェクトを基底クラス型の変数に値としてコピーすると、派生クラス独自の部分が切り捨てられ、仮想関数の呼び出しも基底クラスのものになってしまうバグです。
- vectorの要素をループ中に削除するとイテレータが無効化されるバグstd::vectorの要素をfor文の中でeraseしながら、そのままイテレータをインクリメントし続けてしまうバグです。eraseは削除した位置以降の要素を前に詰めるため、単純な++itでは次の要素を読み飛ばしてしまいます。
- error: no matching function for call to '...'(テンプレートの型推論失敗)の原因と直し方テンプレート関数の2つの引数に異なる型を渡したときに出るエラーです。同じ型パラメータTを2箇所で使うテンプレートは、呼び出し時にすべての箇所で矛盾なく同じ型が推論できなければコンパイルできません。
- terminate called after throwing an instance of '...' の原因と直し方throwで投げた例外をどこのtry-catchでも捕まえられず、プログラム全体が異常終了してしまうバグです。C++のランタイムはstd::terminateを呼び出し、プロセスを強制終了させます。