トップページ > プログラム > 2015年08月23日 > JbH8lT1Q

書き込み順位&時間帯一覧

7 位/150 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000010000001110116



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【JavaScript】スクリプト バトルロワイヤル51【php,py,pl,rb】©2ch.net
C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net

書き込みレス一覧

【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


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。