- - PR -
イベントのリソース解放について
1
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-18 22:14
作成されたイベントハンドルがCloseHandleでクローズされない場合、
内部的にどのようなことが起こるのでしょうか。 Q1.ケース1のように誤ってハンドルが書き換えられた場合、 その瞬間、ハンドルが指していたイベントのリソースはどうなりますか? 宙ぶらりんのままそれ以降も残留するという理解で正しいですか? Q2.ケース2のように誤ってハンドルがスコープから外れた場合、 その瞬間、ハンドルが指していたイベントのリソースはどうなりますか? (Q1と同様の質問) Q3.ケース3のように誤ってCreateEventが二重に実行された場合、 その瞬間、最初のハンドルが指していたイベントのリソースはどうなりますか? (Q1と同様の質問) Q4.(Q1.Q2.Q3において)残留したリソースが解放されるのは最終的にいつの時点までですか?GCが解放してくれるのでしょうか?プロセスの完了時点ですか?ユーザーがログアウトする時点ですか?あるいはWindowsがシャットダウンされるまで残り続けるのですか? Q5.ハンドルが失われてしまった状態において、宙ぶらりんになったリソースが残っているかをチェックし、必要であれば解放する手段はあるのでしょうか? 質問の背景 CreateEventのリソースはアンマネージでGCの対象外と理解していますが正しいでしょうか?リソースの振舞いを明確にしたくて質問しました。 // ***** 正しい方法でリソースが解放されるケース(本来の姿) **** { IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy"); ... CloseHandle(hEvent); // リソースの解放 hEvent = IntPtr.Zero; // 誤使用を避けるため初期化 } // ***** ケース1 CloseHandleせずにhEventを書き換えてしまうケース ***** { IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy"); hEvent = IntPtr.Zero; ... } // ***** ケース2 CloseHandleせずにhEventがスコープが外れるケース { IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy"); } // ***** ケース3 hEventがCreateEventによって書き換えられてしまうケース ***** { IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy1"); ... hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy2"); ... } コメント 一応C#を前提にしていますが、WIN32APIに依存した質問のような気もします。 そういった意味で.NETの会議室に相応しくない質問かも知れませんが... 大目に見てください。 | ||||||||||||||||||||||||||||
|
投稿日時: 2007-02-19 11:17
Yes.
Q1 と同様です。
Q1 と同様です。
何の対策も行わなければ、当該プロセスからの参照はプロセス終了時に解放されます。
してくれません。 GC から見た IntPtr は単なる数値でしかありません。
一般的な方法はありません。
正しいです。 | ||||||||||||||||||||||||||||
|
投稿日時: 2007-02-19 12:29
念のため補足しておくと、「当該プロセスからの参照が解放されること」と「イベントが消滅し、イベントリソースが解放されること」は別です。 イベントは複数のプロセスから参照でき、イベントリソースが解放されるのは、すべてのプロセスからの参照が解放された時です。 [ メッセージ編集済み 編集者: シャノン 編集日時 2007-02-19 12:29 ] | ||||||||||||||||||||||||||||
|
投稿日時: 2007-02-21 23:50
ご回答ありがとうございました。
疑問が明確になりました。 |
1