問題タブ [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.

0 投票する
1 に答える
808 参照

c++ - shared_ptr のコンストラクターによる例外の安全性

効果的な C++ 3/Eで、私はこれを読みました:

これは、例外的に安全でないコードです。

コンパイラは次のように実装できるため:

  1. 走るnew Test
  2. call bar() <--bar()が例外をスローした場合、by によって割り当てられたオブジェクトは削除Testできnew Testません。
  3. のコンストラクターを呼び出すstd::shared_ptr<Test>
  4. 電話foo()

ただし、この場合、コンパイラはメモリ リークがあることを認識できます。delete例外がスローされた場合、コンパイラは自動的に実行できませんか?

さらに、deleteその場合、コンパイラは自動的に次のことを行います。

これは次のように実装されます:

  1. operator newメモリを割り当てる呼び出し
  2. のコンストラクタを呼び出しますTestコンストラクターが例外をスローした場合、メモリは自動的に削除されます。

2番目のケースとは異なり、最初のケースでコンパイラが機能しないのはなぜですか?

0 投票する
1 に答える
698 参照

c++ - QCoreApplication::postEvent の例外安全性の保証

私はこのコードでイベントを投稿しています:

QCoreApplication::postEvent についてはこちらで説明しています。ただし、postEvent で例外がスローされた場合に何をすべきかについての情報はまったくありません。

この関数は、次の 4 つのカテゴリのいずれかに分類されると思います。

  1. 例外をスローすることはありません (特に std::bad_alloc はありません)。
  2. スローされた場合、イベントは決して削除されません。
  3. スローすると、いつかイベントが削除されます。
  4. スローすると、常にイベントが削除されます。

最悪のシナリオは 3 番目です。

では、postEvent がスローされた場合、イベントを削除する必要がありますか?

0 投票する
2 に答える
848 参照

c++ - 失敗する可能性のある関数の引数をシンクし、セマンティクスを移動する (強力な例外安全性)

シンク引数として渡された大量のデータを操作する関数があります。私のBigData型は既に C++11 に対応しており、完全に機能するムーブ コンストラクターとムーブ代入の実装が付属しているため、いまいましいものをコピーする必要はありません。

これはすべて完全に正常に機能します。ただし、処理関数が実行時に失敗して例外が発生することがあります。問題を修正して再試行するだけなので、これは実際には問題ではありません。

もちろん、これはうまくいきません。

データを処理関数に移動したため、例外ハンドラーに到達するまでにはb使用できなくなります。

これにより、シンク引数を値で渡すことに対する私の熱意が大幅に低下する恐れがあります。

そこで質問があります: 最新の C++ コードでこのような状況に対処するにはどうすればよいでしょうか? 以前に実行に失敗した関数に移動されたデータへのアクセスを取得する方法は?

BigDataとの両方の実装とインターフェースを好きなように変更processBigDataできます。ただし、最終的な解決策では、効率と使いやすさに関する元のコードの欠点を最小限に抑える必要があります。

0 投票する
0 に答える
61 参照

c++ - RAII と例外の安全性: いくつかのことに頭を悩ませようとしています。

わかりました、 RAII を理解していると思います。例外の安全性についても理解していると思います。

RAII に準拠するために、またコードをより例外的に安全なものにするために、cMain クラスからエラーのマージンを取り除こうとしました。以前は、cD3D 型の通常のプライベート メンバーがあり、HWND オブジェクトを作成した後、cMain のコンストラクターで Initialize(HWND) を呼び出していました。

もちろん、これは、cD3Dがそのように定義されているという点で、RAIIの要点にある程度反しています。

(このクエリに関係のない他のメンバーの一部を削除しました)

cMain は次のように構成されます。

したがって、cMain の構築時に m_d3d のリソースを取得します。次に、Initialize が個別に呼び出されます。私はこれが好きではなく、決して持っていません。どこかで誰かがオブジェクトを初期化するのを忘れて例外がスローされる可能性があるという考えを開いたままにするからです。この場合、何かが起こる前にすべてが終了していることを確認するため、特に悪いことではありませんが、オブジェクトが使用される前に初期化されていることを確認するためのチェックを追加することについて心配することがよくあります。また、デフォルト コンストラクターとコピー コンストラクターをプライベート化したので、それらを使用することはできません。

その後、次のように変更しました。

何らかの理由で、新しい cD3D(m_hWnd) とその逆参照を除いて、これはより安全に感じられます。

これは RAII の正しい方法ですか? 他のクラスに対してこれを行うと、例外への露出を減らす必要がありますか? 他のことは別として、cD3Dのコピーコンストラクターにアクセスできないようにしたため(同じ理由で)、cD3DをcMainに保存する方法を変更する必要があり、変更する必要がありました

ばかげた質問であることはわかっていますが、正しい方向に向かっていますか? このゲームが最初から適切に作成されていることを確認するために、多くの新しいスキルを学んでいます

0 投票する
1 に答える
251 参照

exception - DirectX 11 API と例外の安全性

DirectX 11 API のさまざまなメソッドの例外安全性レベルに関するドキュメントを見つけることができる場所はありますか?

0 投票する
3 に答える
978 参照

c++ - C++ に含まれる C 標準ライブラリ関数は例外をスローしますか?

new operator以下のコードでは、最初の行でオブジェクトの状態が既に変更されているため、この実装は例外セーフではないため、関数呼び出しによって例外が発生する可能性があることを著者は指摘しています。

読んでいるときに、Cライブラリ関数はC++で例外をスローするのだろうかと思いましたか? C には例外がないことはわかっていますが、C++ コンパイラを使用しているため、例外がある可能性があります。

では、c 標準 lib 関数を例外安全な関数呼び出しと見なすことができますか?

ありがとうございました。

ところで、記録のために、上記の関数を実装する正しい方法 (例外セーフ) を以下に示します。

0 投票する
1 に答える
598 参照

c++ - C++: なぜこの単純なスコープ ガードが機能するのですか?

これまでにスコープガードを見たものはすべて、ガードブール変数を持っています。たとえば、次のディスカッションを参照してください: 最もシンプルできちんとした c++11 ScopeGuard

ただし、単純なガードは機能します (gcc 4.9、clang 3.6.0):

一時コピーが破棄されないのはなぜですか? この動作に依存するのは危険ですか?