問題タブ [raii]
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++ - コール スタックをアンワインドせずに Windows XP で C++ アプリケーションを強制終了することは可能ですか?
私の理解では、Windows XP でタスク マネージャーを使用して C++ アプリケーションを強制終了すると、アプリケーションはまだ「きれいに」破棄されます。つまり、コール スタックが巻き戻され、関連するすべてのオブジェクト デストラクタが呼び出されます。ここで私の理解が間違っているかどうかはわかりません。
スタックを巻き戻さずに、そのようなアプリケーションをすぐに強制終了することは可能ですか?
たとえば、アプリケーションは、オブジェクトが破棄されたときにリソースを破棄または解放する RAII パターンを使用する場合があります。タスク マネージャによる従来の "kill プロセス" が適切である場合、アプリケーションをすぐに kill する方法を提供すると、不適切なシャットダウン (停電など) をテストできます。
編集:
明確にするために、私はこれを可能にする既存のユーティリティまたはプログラムを求めていました。ソースコードを持っていないプログラムでソリューションを使用できるはずです。つまり、プログラムによるソリューションは実際には受け入れられません。
編集:
より多くのコンテキストを提供するために、非常に煩わしいサードパーティのサービスを使用する必要がある場合があります(たとえば、1時間ごとに再起動するようにしつこく言われます)。再起動する必要がないことがわかっているので、プロセス/サービスを強制終了して、もうしつこくならないようにします。残念ながら、サードパーティの開発者の中には、私がこれを行うのを妨げるほど「賢い」人もいました。タスクマネージャーでプロセスを強制終了すると、システムはすぐに再起動します (これを実現するために RAII を使用していると思います)。
c++ - ローカル変数のスコープに関する質問
次のコードで「xxY」と表示されるのはなぜですか? ローカル変数は関数全体のスコープ内に存在するべきではありませんか? このような動作を使用できますか、またはこれは将来の C++ 標準で変更されますか?
C++ 標準 3.3.2 によると、「ブロックで宣言された名前はそのブロックに対してローカルです。その潜在的なスコープは、宣言のポイントで始まり、宣言領域の最後で終わります。」
回答に基づいて、それMyClass(12345);
が式(およびスコープ)であると推測できます。それは理にかなっています。したがって、次のコードは常に「xYx」を出力することを期待しています。
そして、そのような置換を行うことが許可されています:
c++ - コンマ演算子のLHSで匿名のmutex-lock-holdingクラスインスタンスを初期化する
次のようなコードがあるとします。
関数test_raiicomma_1
()が複数のスレッドから呼び出された場合、ミューテックスをロックして、他のスレッドも同時に呼び出さFunc()
れないようにします。ミューテックスは、変数mut1_lock
が作成されるとロックされ、スコープから外れて破棄されると解放されます。
これは完全に正常に機能しますが、スタイルの問題として、ロックを保持している一時オブジェクトに名前を付ける必要があると、私はイライラしました。関数test_raiicomma_2()
は、ロックオブジェクトを初期化し、1つの式内で関数を呼び出すことにより、これを回避しようとしますFunc()
。
Func()
一時オブジェクトデストラクタは、式が戻った後、式が終了するまで呼び出されないというのは正しいですか?(もしそうなら、このイディオムを使用する価値があると思いますか、それとも別のステートメントでロックを宣言する方が常に明確ですか?)
関数test_raiicomma_3()
が2つのミューテックスをロックする必要がある場合、ミューテックスが呼び出す前に順番にロックされ、Func()
後で解放されるのは正しいですか?残念ながら、どちらの順序でも解放される可能性がありますか?
c++ - RAIIスタイルのクラスが「匿名で」インスタンス化されるのを防ぐことは可能ですか?
RAIIスタイルのC++クラスがあるとします。
...私のコードでそのように使用されます:
...目標は、ある状態に入り、何かを行い、そのスコープを離れるときにその状態を離れることです。このタイプミスをコンパイルしないようにする方法はありますか(または警告するか、間違いに気付くことができるように何らかの形で文句を言う)?
これを防ぐために使用できるC++自体の内容はわかりませんが、それが存在しないという意味ではありません。C ++に何もない場合は、コンパイラ固有の拡張機能を使用できます。私は主にgccとmsvcをターゲットにするものに興味があります(いつかicc、他のコンパイラのアイデアは歓迎されますが、役に立つ可能性は低いです)ので、それらのいずれかをハックすると便利です(もちろん、適切に#ifdefされたマクロ定義に抽象化されます) 。
c# - C# - スコープ外に出るとオブジェクトはすぐに破棄されますか?
C# でオブジェクトがスコープ外になると、オブジェクトが破棄され、そのデストラクタがすぐに呼び出されることを信頼できますか?
多くの一般的なコーディング プラクティス (トランザクション オブジェクトなど) がこの動作に依存しているため、そうすべきだと思いますが、私はガベージ コレクションの操作にあまり慣れておらず、そのような言語が通常どのように動作するかについてほとんど洞察がありません。
ありがとう。
inversion-of-control - 制御の反転とRAIIは一緒にプレイできますか?
制御の反転(IOC)について読んでいたところ、メモリ管理が面倒になっているように思われました。もちろん、iocは主にガベージコレクション環境(Net、Java、Scripting)で使用されているようですが、私の懸念は非gc設定です。
ここでの私の懸念は、リソースの有効期間をオブジェクトの有効期間から切り離すため、IOCがRAIIに反することです。この追加された複雑さは他の誰かを悩ませませんか?そして本当の問題は、物事をスムーズに進めるためにどのような技術を使用できるかということです。
c++ - 非オブジェクトリソースをRAII準拠にする
私のコードでは、HANDLE
からsを使用していますwindows.h
。彼らはのように使用されます
CloseHandle
ご覧のとおり、取得と解放の途中で発生する可能性のあるすべての例外にこれを挿入する必要があります。したがって、1つを忘れて(または知らなかった派手なSEH例外があり)、ボイラーになる可能性があります。メモリリークが発生します。
CloseHandle
最近、私はそのような場合の頭痛を取り除き、これを自動的に呼び出すべきであるRAIIについて読みました。また、C ++のようstd::auto_ptr<someType>
に、で割り当てられたリソースの問題を解決するものがあることもわかりましたnew
。
しかし、私は使用せず、new
ただHANDLE
でtypedef
あるためvoid *
、をどのように使用すればよいのでしょうかstd::auto_ptr<someType>
。どういうわけか、それにカスタム削除関数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
)を与えることが可能であるはずです。クラスのインスタンスがスコープ外になるたびにデストラクタが呼び出されるため、クラスの作成は別のメソッドになります。ただし、単純なことすべてにクラスを設けるのはやり過ぎです。
これらの偶発的なメモリリークを修正するにはどうすればよいですか?
ライブラリがなく、依存関係が大きい純粋なC ++のソリューションを好むことに注意してください。ただし、それらが本当に小さく、ほとんどの環境で使用されている場合を除きます。
c++ - カスタムデリータでshared_ptrを使用してHANDLERAIIに準拠させる
最近、 SOでRAIIに関する一般的な質問を投稿しました。ただし、HANDLEの例にはまだいくつかの実装上の問題があります。
AHANDLE
はでtypedeffedさvoid *
れwindows.h
ます。したがって、正しいshared_ptr
定義は次のようになります。
例1 CreateToolhelp32Snapshot
:戻りHANDLE
、動作します。
定義で使用void
しているように(正しい方法は何ですか?)、このポインターを使用してさらにいくつかのwinapiコマンドを呼び出そうとすると、問題が発生します。それらは機能的には機能しますが、醜いので、より良い解決策が必要だと確信しています。
次の例でh
は、は上部の定義を介して作成されたポインタです。
例2 OpenProcessToken
:最後の引数はPHANDLE
。キャストで中程度の醜い。
例3 Process32First
:最初の引数はHANDLE
。本当に醜い。
例4定数との簡単な比較HANDLE
。本当に醜い。
HANDLEに適切なshared_ptrを作成する正しい方法は何ですか?
c++ - ヒープの破損を修正する方法
私は非常に最小限のメモリ読み取りライブラリを構築して、そこからいくつかunsigned int
の を読み取ろうとしました。ReadUnsignedInt
ただし、メソッドが戻りたいときに、「HEAP CORRUPTION DETECTED」というエラー メッセージが表示されます。
ヒープ破損が検出されました。CRT は、アプリケーションがバッファーの終了後にメモリに書き込んだことを検出しました。
私が読んだように、これは何かを二重に削除しようとするときの原因かもしれません。これは の誤った使用が原因である可能性がありますが、何が間違っているのstd::tr1::shared_ptr
か特定できません。コードは次のとおりです (エラー処理は省略)。
c++ - ハンドル ラッパーへの機能の追加
次のように、boost::shared_ptr<> を使用して Win32 HANDLE を管理するための C++ RAII クラスがあります。
代わりに次のように拡張したいと思います。
私は書くことができます:
CHandle クラスを CEvent クラスのメンバーとして使用するのが最善の方法でしょうか?
または、より良い方法はありますか?(boost::shared_ptr<> によって指定された CHandle のコピー セマンティクスを維持したいことに注意してください。
ありがとう、ポールH