問題タブ [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++ - コンストラクターのパラメーターに関連する例外安全性のイディオム
私が取り組んでいるいくつかのコードを見てきましたが、これと同等のものがあります:
ここで、AutoPtr は auto_ptr のバージョンであり、Detach() は所有されているポインターを返し、それ自体をリセットします。また、B() は x の所有権を取得します。
ここで、new が std::bad_alloc をスローすると x がリークすることに気付いたので、コードを次のように変更しました。
しかし、その後、B() がポインターを「所有」し、その構築中に例外が発生した場合、パラメーター自体を削除する必要がある (またはそうすべきか?) ため、x は B によって 1 回、2 回削除されることに気付きました。 ()、および x のデストラクタによって 1 回。
さて、この問題を回避する C++ イディオムはありますか? たとえば、コンストラクターを呼び出してパラメーターのクリーンアップを担当するコードを作成しますか? 私が見たほとんどのコードはそうではないようです...
c++ - unique_ptrs のコンテナーで emplace_back を使用しても安全ですか?
次の点を考慮してください。
ベクトルで再割り当てが発生し、それが失敗した場合 ( をスローstd::bad_alloc
)、私は「安全」ですか、それともリークしint
ますか?
C++11 23.3.6.5 [vector.modifiers]/1 言います:
コピー コンストラクター、ムーブ コンストラクター、代入演算子、ムーブ代入演算子以外によって、
T
または任意のInputIterator
操作によって例外がスローされた場合、影響はありません。
これは、これが潜在的な問題であることを示しているようです。つまり、「影響がない」場合、unique_ptr
構築されたものはありません。そのため、そのポインタに依存するデストラクタの動作delete
は発生しません。(これは、s のemplace_back
コンテナーに対して禁止する必要があることを示している可能性がありますunique_ptr
)
c++ - C++ 暗黙的に生成された代入演算子の例外安全性
私の理解では、C++の暗黙的に生成された代入演算子はメンバーごとのコピーを行います(これは、この回答でも確認されているようです)。しかし、メンバーのコピー中に例外がスローされた場合 (たとえば、そのメンバーのリソースを割り当てることができないため)、コピーされているオブジェクトは無効な状態でスタックしますか?
つまり、暗黙的に生成された代入演算子は基本的な保証のみを達成し、強力な保証は達成しないのでしょうか?
クラスのコピーに強力な保証が必要な場合は、コピー アンド スワップイディオムを使用して代入演算子を手動で実装する必要がありますか?
c++ - 実装は、イテレータのコピーコンストラクタがスローされないことをどのように保証できますか?
C ++ 11規格の23.2.1.10項は、次のように述べています。
「返されたイテレータのコピーコンストラクタは例外をスローしません」
これは基本的に、イテレータのコピーコンストラクタがbad_allocさえもスローしない可能性があることを示していますか(イテレータが単なるポインタであり、ここでは問題がない場合を残します)、「返された」ですでに構築された情報を使用するためです。イテレータ」?値によって渡されるため、スタックは呼び出された関数に割り当てられ、メモリの問題がないことを保証できますか?
c++ - std::tie はどの程度例外的に安全ですか?
std::tie
参照のタプルを返すため、次のことができます。
foo, bar, baz = (1, 2, 3)
これはPython の場合と似ています。
次の例のように、割り当ての 1 つがスローされた場合はどうなるでしょうか?
1337 または 42 を出力しますか、それとも未指定ですか?
c# - C# を使用した ROT での COM オブジェクトへの強い参照の作成
実行中の COM インスタンスにバインドする必要があります (探しているもののインスタンスが多数存在する可能性があるため、実行中のオブジェクト テーブルを調べてどれが適切かを判断する必要があります) CoClassCreate またはnew
クラスでの演算子を使用すると、私には選択肢がありません。
私が持っているコードは、例外セーフではないことを除いて、ほとんど機能します。
Revoke
以下のコードのように例外がスローされた場合、舞台裏で発生する自動を回避する方法はありますか? アプリケーションが終了すると、それを登録したアプリケーションがまだ実行されている間に、COM オブジェクトは ROT から削除されます。Release() が自動的に呼び出され、それが COM を参照する最後のオブジェクトであったため、ROT エントリが消えていることは確かです。
アトミックで例外セーフな方法で、ROT 内のオブジェクトへの強い参照を取得したいと考えています。
メソッドと組み合わせてモニカを使用しようとする試みはすべてBindToObject
失敗しました。.NET 4.0 での実装に問題はありますか? 最初の呼び出しは機能しているように見えますが、IUnknown の Guid を使用している場合でも、後続の呼び出しはすべて Argument または invalidCast 例外で失敗します。私の知る限り、これは常に成功するはずですか、それとも何かを見落としていますか?
これは、これまでに作成できた最高の作業コードです。例外の安全性が恋しいだけです。このプログラムは、単独で実行することを意図しており、割り込み可能です (例外をスローして、いつでもトレッドを中断できます)。この未完の仕事を放っておくと、きれいに解決できなければ、確かに問題が発生します。
追記: これは、OutProc サーバーがアクティブなオブジェクトを弱参照のみとして登録した場合に発生する可能性があります。私はこれに影響を与えません。私はサーバー側の作成者ではありません...オブジェクトが実行中のオブジェクトテーブルから取り消されるリスクを冒さずに、実行中のオブジェクトにバインドする必要があります。
c++ - Lua、スレッド、C++の例外
現在取り組んでいるプロジェクトでは、C++ではなくluaを検討し始めることを開発チームに提案する予定です。その件に関して、私は最初に解決する必要がある質問があります。
現在のSDKでは、マルチスレッドアプリケーション(そのSDKで作成された)では安全ではないため、C++例外を使用することは許可されていません。実際には、許可されていますが、お勧めできません...ただし、-fno-exceptionsを渡さない限り、プログラムはコンパイルされません。したがって...ええ...
ともかく。Luaはそれ自体のVMで実行され、純粋なCであるため... Luaの例外は「安全」でしょうか?
c++ - コンパイラの最適化が例外安全性の高いコードを強力に並べ替えるのを妨げるものは何ですか?
カーギルウィジェットの例を解決するためのJonKalbの強力な例外安全コードを考えると、コンパイラが操作を再編成してコードを強力に例外安全ではないようにするのを妨げるものは何ですか?
それは「コンパイラは観察可能な振る舞いを変更できない」というルールですか?
参照:
- Jon Kalbの「例外安全コード」プレゼンテーションスライド: http: //www.exceptionsafecode.com/slides/esc.pdf
c++ - 非スロー例外保証とスタック オーバーフロー
通常、例外をスローしないことを保証するいくつかの特別な関数があります。
- デストラクタ
swap
方法
この回答swap
に記載されているように、次の実装を検討してください。
swap
整数用とポインタ用の2 つの関数を使用します。2 番目の関数でスタック オーバーフローが発生した場合はどうなるでしょうか。オブジェクトが破損します。ではなく、std::exception
ある種のシステム例外だと思いWin32-exception
ます。しかし、関数を呼び出しているため、スローしないことを保証できません。
しかし、すべての信頼できるソースは問題ないswap
ように使用され、ここで例外がスローされることはありません。なんで?