問題タブ [exception-safety]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - shared_ptr のコンストラクターによる例外の安全性
効果的な C++ 3/Eで、私はこれを読みました:
これは、例外的に安全でないコードです。
コンパイラは次のように実装できるため:
- 走る
new Test
- call
bar()
<--bar()
が例外をスローした場合、by によって割り当てられたオブジェクトは削除Test
できnew Test
ません。- のコンストラクターを呼び出す
std::shared_ptr<Test>
- 電話
foo()
ただし、この場合、コンパイラはメモリ リークがあることを認識できます。delete
例外がスローされた場合、コンパイラは自動的に実行できませんか?
さらに、delete
その場合、コンパイラは自動的に次のことを行います。
これは次のように実装されます:
operator new
メモリを割り当てる呼び出し- のコンストラクタを呼び出します
Test
。コンストラクターが例外をスローした場合、メモリは自動的に削除されます。
2番目のケースとは異なり、最初のケースでコンパイラが機能しないのはなぜですか?
c++ - QCoreApplication::postEvent の例外安全性の保証
私はこのコードでイベントを投稿しています:
QCoreApplication::postEvent についてはこちらで説明しています。ただし、postEvent で例外がスローされた場合に何をすべきかについての情報はまったくありません。
この関数は、次の 4 つのカテゴリのいずれかに分類されると思います。
- 例外をスローすることはありません (特に std::bad_alloc はありません)。
- スローされた場合、イベントは決して削除されません。
- スローすると、いつかイベントが削除されます。
- スローすると、常にイベントが削除されます。
最悪のシナリオは 3 番目です。
では、postEvent がスローされた場合、イベントを削除する必要がありますか?
c++ - 失敗する可能性のある関数の引数をシンクし、セマンティクスを移動する (強力な例外安全性)
シンク引数として渡された大量のデータを操作する関数があります。私のBigData
型は既に C++11 に対応しており、完全に機能するムーブ コンストラクターとムーブ代入の実装が付属しているため、いまいましいものをコピーする必要はありません。
これはすべて完全に正常に機能します。ただし、処理関数が実行時に失敗して例外が発生することがあります。問題を修正して再試行するだけなので、これは実際には問題ではありません。
もちろん、これはうまくいきません。
データを処理関数に移動したため、例外ハンドラーに到達するまでにはb
使用できなくなります。
これにより、シンク引数を値で渡すことに対する私の熱意が大幅に低下する恐れがあります。
そこで質問があります: 最新の C++ コードでこのような状況に対処するにはどうすればよいでしょうか? 以前に実行に失敗した関数に移動されたデータへのアクセスを取得する方法は?
BigData
との両方の実装とインターフェースを好きなように変更processBigData
できます。ただし、最終的な解決策では、効率と使いやすさに関する元のコードの欠点を最小限に抑える必要があります。
c++ - RAII と例外の安全性: いくつかのことに頭を悩ませようとしています。
わかりました、 RAII を理解していると思います。例外の安全性についても理解していると思います。
RAII に準拠するために、またコードをより例外的に安全なものにするために、cMain クラスからエラーのマージンを取り除こうとしました。以前は、cD3D 型の通常のプライベート メンバーがあり、HWND オブジェクトを作成した後、cMain のコンストラクターで Initialize(HWND) を呼び出していました。
もちろん、これは、cD3Dがそのように定義されているという点で、RAIIの要点にある程度反しています。
(このクエリに関係のない他のメンバーの一部を削除しました)
cMain は次のように構成されます。
したがって、cMain の構築時に m_d3d のリソースを取得します。次に、Initialize が個別に呼び出されます。私はこれが好きではなく、決して持っていません。どこかで誰かがオブジェクトを初期化するのを忘れて例外がスローされる可能性があるという考えを開いたままにするからです。この場合、何かが起こる前にすべてが終了していることを確認するため、特に悪いことではありませんが、オブジェクトが使用される前に初期化されていることを確認するためのチェックを追加することについて心配することがよくあります。また、デフォルト コンストラクターとコピー コンストラクターをプライベート化したので、それらを使用することはできません。
その後、次のように変更しました。
何らかの理由で、新しい cD3D(m_hWnd) とその逆参照を除いて、これはより安全に感じられます。
これは RAII の正しい方法ですか? 他のクラスに対してこれを行うと、例外への露出を減らす必要がありますか? 他のことは別として、cD3Dのコピーコンストラクターにアクセスできないようにしたため(同じ理由で)、cD3DをcMainに保存する方法を変更する必要があり、変更する必要がありました
に
ばかげた質問であることはわかっていますが、正しい方向に向かっていますか? このゲームが最初から適切に作成されていることを確認するために、多くの新しいスキルを学んでいます
exception - DirectX 11 API と例外の安全性
DirectX 11 API のさまざまなメソッドの例外安全性レベルに関するドキュメントを見つけることができる場所はありますか?
c++ - C++ に含まれる C 標準ライブラリ関数は例外をスローしますか?
new operator
以下のコードでは、最初の行でオブジェクトの状態が既に変更されているため、この実装は例外セーフではないため、関数呼び出しによって例外が発生する可能性があることを著者は指摘しています。
読んでいるときに、Cライブラリ関数はC++で例外をスローするのだろうかと思いましたか? C には例外がないことはわかっていますが、C++ コンパイラを使用しているため、例外がある可能性があります。
では、c 標準 lib 関数を例外安全な関数呼び出しと見なすことができますか?
ありがとうございました。
ところで、記録のために、上記の関数を実装する正しい方法 (例外セーフ) を以下に示します。
c++ - C++: なぜこの単純なスコープ ガードが機能するのですか?
これまでにスコープガードを見たものはすべて、ガードブール変数を持っています。たとえば、次のディスカッションを参照してください: 最もシンプルできちんとした c++11 ScopeGuard
ただし、単純なガードは機能します (gcc 4.9、clang 3.6.0):
一時コピーが破棄されないのはなぜですか? この動作に依存するのは危険ですか?