プログラミング例外が投げられるとき、例外安全なコードとは次の2点を満たすことである。pointerなどリソース管理オブジェクトを適切に使うことで防ぐことができる。データ構造の保護に関しては次の3つのうち1つを保証しなければならない。guarantee)をする例外を投げない例外を投げない保証をするのが一番良いが、例外を投げないことが保証されている組み込み型の操作以外は一般に例外を出す操作が多く保証が難しい(STLのコンテナなど動的なメモリ確保を行うものはbad_alloc例外を出す可能性がある)。throw();と例外を投げないと宣言してもC++では「funcが例外を投げたらそれは深刻なエラーなのでunexpected関数が実行される」という意味になる。例外安全かどうかは宣言ではなく実装で決まるのである。C++11では例外を投げないことを示すキーワードnoexceptが導入された。noexcept;とするといかなる例外も送出しないことを保証できる。多くの処理では投げない保証は難しいので基本保証か強い保証を考えることになる。強い保証を実現するための一般的な方法として「コピーと交換」が知られている。「コピーと交換」では変更したいオブジェクトのコピーを作るコピーを変更する変更が完了したら例外を投げない交換処理で元のオブジェクトと交換すると実装する。コピーオブジェクトの変更中に例外が発生した場合は元のオブジェクトは変更を受けず、変更が完了した場合にのみオブジェクトが変更されることになり強い保証を実現することができる。「コピーと交換」では変更ごとにオブジェクトのコピーを生成する必要があり性能問題が生じる可能性がある。その場合は基本保証をするべきである。C++日本語リファレンススポンサーリンクシェアするツイートフォローするstarpentagon関連記事ポリモーフィズムのための基底クラスには仮想デストラクタを宣言する派生クラスのオブジェクトを破棄するときに「仮想デストラクタを持たない基底クラス」のポインタをdeleteするとその結果は未定義になる。16.04で構築した際のメモです。日本語Remixのダウ...記事を読むスマートポインタに渡すのは独立したステートメントで行うC++では引数の評価順をコンパイラが決めて良いことになっている。そのため、コンパイラ依存でメモリリークが発生する可能性がある。してPythonスクリプトを実行しますが、よく使うスクリプトだと毎回pythonと入力するのがめんどくさいので直接Pytho...記事を読むオブジェクト全体をコピーするコピー関数を定義した際にはオブジェクト全体をコピーするように注意する必要がある。つなげて使うことができる。CodeでのC++デバッグ方法デバッグ用にプログラムをビルドする。CodeでF5を...記事を読むconstを使うconstキーワードをつけることで特定オブジェクトについて「変更してはいけない」制約をはっきりさせ、コンパイラにその制約を守っているかのチェ...記事を読むコンストラクタはexplicit付きで宣言するexplicit無しで宣言されたコンストラクタは意図しない暗黙の型変換を引き起こすのでexplicit付きで宣言する方がよい。Testを導入します。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。starpentagonの。