- 【JavaScript】スクリプト バトルロワイヤル51【php,py,pl,rb】©2ch.net
433 :デフォルトの名無しさん[sage]:2015/08/23(日) 11:35:50.42 ID:JbH8lT1Q - 医者や弁護士に相談して泡を食ったらだろ
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
611 :デフォルトの名無しさん[sage]:2015/08/23(日) 18:44:40.15 ID:JbH8lT1Q - MSDN確認してその通りにやればいいだけでは?
> 基本クラスが IDisposable を実装する場合は、オブジェクトは基本クラスの Dispose メソッドも呼び出す必要があります。 > Dispose のメソッドを明示的に呼び出す必要があるため Dispose のメソッドを呼び出してオブジェクトのコンシューマーがに失敗したため、 > アンマネージ リソースが解放されないこと危険性が常にあります。 これを回避するには、次の 2 とおりの方法があります。 > ・System.Runtime.InteropServices.SafeHandle から派生されるオブジェクトのマネージ リソースをラップしてください。 > ・Dispose が呼び出されないときにリソースを解放するようにファイナライザーを実装してください。 > StreamWriter などのアンマネージ リソースにアクセスするオブジェクトを使用するときは、using ステートメントでインスタンスを作成することをお勧めします。 > using ステートメントは、使用しているコードが完了すると、ストリームを自動的に閉じ、オブジェクトの Dispose を呼び出します。 > https://msdn.microsoft.com/ja-jp/library/system.idisposable.dispose(v=vs.110).aspx
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
623 :デフォルトの名無しさん[sage]:2015/08/23(日) 19:53:17.04 ID:JbH8lT1Q - >>616
今更ながらPenがDisposeを実装していると知った。(もちろんDisposeしたことはない) 何でこれまで気づかなかったのかと探せば、 PenのサンプルコードではDisposeしているが、DrawLinesのではしていないからだ。 > https://msdn.microsoft.com/ja-jp/library/system.drawing.pen.dispose(v=vs.110).aspx > https://msdn.microsoft.com/ja-jp/library/7ewkcdb3(v=vs.110).aspx なお、これまで特に問題を感じたことはなかった。 >>617 Finalize自体はDisposeと大して変わらないよね? GC自体のコストと、メモリ撹拌の問題はあるにしても。 Disposeした方がもちろんお行儀がいいとして。 てか、gcnew って delete しなくていいためのものじゃなかったんかー! ファイルはクローズしてるけど、他は全部放置してたわw (なおVC++使い)
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
633 :デフォルトの名無しさん[sage]:2015/08/23(日) 20:50:07.75 ID:JbH8lT1Q - >>625
コンセプトとしてはその通りだけど、ID:hc4Y2Ev5が言っているのもまた然りだと思うよ。 本来は、全部GCに任せた上で、理由がある場合のみ手動でDisposeという仕様を目指しているのだと思う。 現実的にはこれはほぼ完成しており、通常の範囲で問題になることはない。(少なくとも俺は命中していない) ただ、MSDNで > 基本クラスが IDisposable を実装する場合は、オブジェクトは基本クラスの Dispose メソッドも呼び出す必要があります。(611) と言っている以上、Finalizerだけでは駄目なケースがあって、それに命中する可能性も残っているのだと思う。 とはいえ、普通に実装すればFinalizeはまずDisposeをコールするだろうから、 問題が発生するとしたらタイミングだけのはずだけど。 確認してみたけど、C#のデストラクタは起動を予約してGCから起動するという仕様のように見える。 > http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_011/csharp_abc03.html 確かにこれだとFile等はClose/Disposeをしないといつロックを解除してくれるか分からない。 だから>>627-628の言うことはあっている。620の3つのケースもあり得ると思う。 理由は指摘の通り、C#ではデストラクタの起動順/タイミングが規定できないからだね。
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
650 :デフォルトの名無しさん[sage]:2015/08/23(日) 22:37:24.13 ID:JbH8lT1Q - >>639
仰るとおり、C++→C#へのポーティングではC#のデストラクタには期待できないから、 いちいち手動で順番も考慮してDispose()しかなさそうだ。 ただこれはだいぶ手間だから、何らかの上手い解決策が既にありそうだけどね。 仕様から言って、C#ではデストラクタの起動順を期待するコーディングをしてはいけない。 ただ、 > フィールド上に確保していたバッファがデストラクタ中のクローズ処理よりも先に解放されてしまうなどですかね (635) これはよく分からない。(これが発生する可能性がシステム的にあることは分かる) とはいえ、C#って多重継承できないし、アンマネージドとマネージドを混ぜてぐちゃぐちゃにしたりすることがなければ、 これって無いよね? (逆に言えば、マネージドコードだけならこういったことは発生しない、と思っている。 そして本来はアンマネージドを大量に使うことこそが問題。ポーティングならある程度致し方ないにしても。)
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
664 :デフォルトの名無しさん[sage]:2015/08/23(日) 23:06:20.29 ID:JbH8lT1Q - >>657
見た目はマークスイープだけど、中身は参照カウント方式だったはず。(だからそれなりに順を追ってGCされる) というのを中の人が書いたドキュメントがあったはずだが、検索しても今はでてこない。 ブクマによると多分以下なのだが、アーカイブになっていてどれなのか分かりませんorz Microsoft .NET Framework の自動メモリ管理 Part I http://msdn.microsoft.com/ja-jp/library/bb985010.aspx
|