C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: g.Dispose();のコードについて


(過去ログ 39 を表示中)

[トピック内 37 記事 (1 - 20 表示)]  << 0 | 1 >>

■20643 / inTopicNo.1)  g.Dispose();のコードについて
  
□投稿者/ 初心VC#2008 (1回)-(2008/06/13(Fri) 13:45:17)

分類:[C#] 

初心者の極めてしょぼい質問ですがよろしくお願いします。

画像オブジェクトを作成して、そこに描画してからリソースを解放するということで
g.Dispose();のコードを書くようになっていますが、
これは、メモリを解放するための処理と書かれてあったのですが、画像を削除するという
ことではないのですよね。(画像が消えないのでもちろんそう思いますが)

では、g.Dispose();を記述しない場合はどのような不都合が生じるのでしょうか?
(メモリ不足になるのでしょうか。)

これはいわゆるC#の約束事と理解してよろしいのでしょうか?
ちなみにリソースを自動的に解放してくれる言語はあるのでしょうか?

引用返信 編集キー/
■20645 / inTopicNo.2)  Re[1]: g.Dispose();のコードについて
□投稿者/ επιστημη (1086回)-(2008/06/13(Fri) 13:48:32)
επιστημη さんの Web サイト
> これは、メモリを解放するための処理と書かれてあったのですが、

ウソです。言わば「描画のために借りてきた絵筆を返却する」よなもんです。

引用返信 編集キー/
■20647 / inTopicNo.3)  Re[2]: g.Dispose();のコードについて
□投稿者/ 初心VC#2008 (1回)-(2008/06/13(Fri) 13:52:27)
No20645 (επιστημη さん) に返信
>>これは、メモリを解放するための処理と書かれてあったのですが、
> 
> ウソです。言わば「描画のために借りてきた絵筆を返却する」よなもんです。
> 
では、返却しなかったらどうなりますか?

引用返信 編集キー/
■20648 / inTopicNo.4)  Re[3]: g.Dispose();のコードについて
□投稿者/ επιστημη (1087回)-(2008/06/13(Fri) 13:59:55)
επιστημη さんの Web サイト
> では、返却しなかったらどうなりますか?

簡単に実験できますから試してみてはいかがでしょうか

引用返信 編集キー/
■20651 / inTopicNo.5)  Re[3]: g.Dispose();のコードについて
□投稿者/ よねKEN (152回)-(2008/06/13(Fri) 14:24:47)
>>ウソです。言わば「描画のために借りてきた絵筆を返却する」よなもんです。
>>
> では、返却しなかったらどうなりますか?

そのうちに「取立て屋」が取り立てに来ます。
そいつの名は「GC」。


引用返信 編集キー/
■20653 / inTopicNo.6)  Re[4]: g.Dispose();のコードについて
□投稿者/ 初心VC#2008 (2回)-(2008/06/13(Fri) 14:34:02)
No20651 (よねKEN さん) に返信
> >>ウソです。言わば「描画のために借りてきた絵筆を返却する」よなもんです。
> >>
>>では、返却しなかったらどうなりますか?
>
> そのうちに「取立て屋」が取り立てに来ます。
> そいつの名は「GC」。
>
>
なるほど。
解決済み
引用返信 編集キー/
■20654 / inTopicNo.7)  Re[4]: g.Dispose();のコードについて
□投稿者/ Z (16回)-(2008/06/13(Fri) 14:36:24)
No20651 (よねKEN さん) に返信
> >>ウソです。言わば「描画のために借りてきた絵筆を返却する」よなもんです。
> >>
>>では、返却しなかったらどうなりますか?
>
> そのうちに「取立て屋」が取り立てに来ます。
> そいつの名は「GC」。
>
>

すいません、ちょっと相乗りで確認させてください。

Graphicsオブジェクトとかのリソースって「GC」出来ましたっけ?
ファイルオープンとかDBリソースとかGraphicsオブジェクトとか、アンマネージものとか
のように「Dispose」や他の明示的な解放を強要するものは「GC」では対応できないと
思ってるんですけど。

引用返信 編集キー/
■20655 / inTopicNo.8)  Re[4]: g.Dispose();のコードについて
□投稿者/ 出水 (72回)-(2008/06/13(Fri) 14:36:34)
OnPaint内でCreateGraphicsやってるだけだとわからないかも…
DCの取り合いって事態にならないと問題は見えてこないんじゃないですかね?

Windows98の頃は露骨に他のアプリに影響与えてたんで
わかりやすかったんですけど…
引用返信 編集キー/
■20657 / inTopicNo.9)  Re[5]: g.Dispose();のコードについて
□投稿者/ よねKEN (153回)-(2008/06/13(Fri) 15:00:30)
> Graphicsオブジェクトとかのリソースって「GC」出来ましたっけ?
> ファイルオープンとかDBリソースとかGraphicsオブジェクトとか、アンマネージものとか
> のように「Dispose」や他の明示的な解放を強要するものは「GC」では対応できないと
> 思ってるんですけど。

GCの処理ではFinalizeメソッド(=C#だとデストラクタの実装)が呼ばれます。
Disposeメソッドを実装するメソッドは、通常このFinalizeメソッドをオーバーライドしており、
その中でDiposeメソッドが呼ばれます。

より詳しい話は書籍「プログラミングMicrosoft .NET Framework」が参考になります。


引用返信 編集キー/
■20659 / inTopicNo.10)  Re[6]: g.Dispose();のコードについて
□投稿者/ Z (17回)-(2008/06/13(Fri) 15:16:55)
No20657 (よねKEN さん) に返信


> GCの処理ではFinalizeメソッド(=C#だとデストラクタの実装)が呼ばれます。
> Disposeメソッドを実装するメソッドは、通常このFinalizeメソッドをオーバーライドしており、
> その中でDiposeメソッドが呼ばれます。
>
> より詳しい話は書籍「プログラミングMicrosoft .NET Framework」が参考になります。
>

「GC」が何時発生するか保障できず、その前にリソースを食いつぶす可能性があるため、
「GC」によるDisposeでは対応しきれないってことでOKですか?

このように理解しているのですが。
引用返信 編集キー/
■20660 / inTopicNo.11)  Re[5]: g.Dispose();のコードについて
□投稿者/ Z (18回)-(2008/06/13(Fri) 15:27:54)

すいません、GCとDisposeについて「宇宙仮面」様の
ページに説明があり、それを読んで納得しました。
お騒がせしました。

ちなみに、自分は「Dispose明示的」派でしょうか。
ちゃんとソースを整理して書くときは「using」派ですかね。

引用返信 編集キー/
■20661 / inTopicNo.12)  Re[7]: g.Dispose();のコードについて
□投稿者/ よねKEN (154回)-(2008/06/13(Fri) 15:30:17)
>>GCの処理ではFinalizeメソッド(=C#だとデストラクタの実装)が呼ばれます。
>>Disposeメソッドを実装するメソッドは、通常このFinalizeメソッドをオーバーライドしており、
>>その中でDiposeメソッドが呼ばれます。
>>
>>より詳しい話は書籍「プログラミングMicrosoft .NET Framework」が参考になります。
>>
> 「GC」が何時発生するか保障できず、その前にリソースを食いつぶす可能性があるため、
> 「GC」によるDisposeでは対応しきれないってことでOKですか?
>
> このように理解しているのですが。

はい、そうです。
.NET Framework1.0が登場したころ、Windows2000環境で趣味の開発をしていて、
BitmapオブジェクトのDiposeをしていなくて、リソース不足に陥ったことがあります。
Paintイベントだとか、Timerコントロールだとかで頻繁に画面を更新していたため、
積もり積もったようで、画面全体の色が変になっていました。
それ以来、きっちりDisposeするようにしています。



引用返信 編集キー/
■20662 / inTopicNo.13)  Re[5]: g.Dispose();のコードについて
□投稿者/ επιστημη (1089回)-(2008/06/13(Fri) 15:31:49)
επιστημη さんの Web サイト
ごめん、僕もきっちりとは理解できてないポいので確認させて。

-Dispose()は要は後始末。絵筆を洗って返却する、みたいな。
-で、絵筆のストックは有限だから返さないままほっといたらみんなが迷惑する。
-なのでファイナライザ中に後始末処理が埋め込まれている。
-ファイナライザはGCに伴って呼び出される。
-だからDisposeせずにほっといてもいつか(GC時)はDisposeされる。
-ところが困ったことに、そのいつか(=GC時)が訪れる前に絵筆が枯渇する恐れがある。
-加えてDiposeされる順番は取得した順(or逆順)とは限らない。後始末の順序は制御不能。
-だから使い終わったら可及的速やかにDisposeしなければならない。
-おまけ:using使うとスコープ外れるとき勝手にDisposeしてくれっから楽よ♪

この認識でおk?

引用返信 編集キー/
■20664 / inTopicNo.14)  Re[6]: g.Dispose();のコードについて
□投稿者/ じゅで (48回)-(2008/06/13(Fri) 15:39:45)
No20660 (Z さん) に返信
> ちなみに、自分は「Dispose明示的」派でしょうか。
> ちゃんとソースを整理して書くときは「using」派ですかね。

自分もusing派です。
スコープがはっきりします。

ついで、宇宙仮面様のHPリンクをば、乗っけておきます。

http://uchukamen.com/Programming/GC/index.htm#GCお任せパターン

たぶんこれの事ですよね?

仕事中の息抜きは大切だorz
引用返信 編集キー/
■20665 / inTopicNo.15)  Re[6]: g.Dispose();のコードについて
□投稿者/ Z (19回)-(2008/06/13(Fri) 15:50:10)
No20662 (επιστημη さん) に返信
> ごめん、僕もきっちりとは理解できてないポいので確認させて。
>
> -Dispose()は要は後始末。絵筆を洗って返却する、みたいな。
> -で、絵筆のストックは有限だから返さないままほっといたらみんなが迷惑する。
> -なのでファイナライザ中に後始末処理が埋め込まれている。
> -ファイナライザはGCに伴って呼び出される。
> -だからDisposeせずにほっといてもいつか(GC時)はDisposeされる。
> -ところが困ったことに、そのいつか(=GC時)が訪れる前に絵筆が枯渇する恐れがある。
> -加えてDiposeされる順番は取得した順(or逆順)とは限らない。後始末の順序は制御不能。
> -だから使い終わったら可及的速やかにDisposeしなければならない。
> -おまけ:using使うとスコープ外れるとき勝手にDisposeしてくれっから楽よ♪
>
> この認識でおk?
>

自分は、これと同じ認識でいました。
「GC」ではメモリとかは見てタイミング良く「GC」してくれるけど、
他のリソース(絵筆とかDBへのコンセント)については把握していないから、
明示的にDisposeしろと。

ただ、宇宙仮面様のページを見て思ったんですけど、
「画像系ってメモリ以外の資源は気にしなくていいんだ。」
って思いました。もし、メモリ以外のリソースを使っているなら、
メモリ枯渇で「GC」する前に、他のリソースが枯渇してしまうのだから、
「GC」に頼ることは出来ないはずですし。
(明示的なDisposeを期待するオブジェクトは全てメモリ以外の
リソースを使用している可能性があるのだと思っていました)

それとも「GC」はメモリ以外のリソースについても管理し、「GC」が
走るのでしょうか?


引用返信 編集キー/
■20666 / inTopicNo.16)  Re[7]: g.Dispose();のコードについて
□投稿者/ じゅで (49回)-(2008/06/13(Fri) 16:07:40)
No20665 (Z さん) に返信
>
> 自分は、これと同じ認識でいました。
> 「GC」ではメモリとかは見てタイミング良く「GC」してくれるけど、
> 他のリソース(絵筆とかDBへのコンセント)については把握していないから、
> 明示的にDisposeしろと。
>
> ただ、宇宙仮面様のページを見て思ったんですけど、
> 「画像系ってメモリ以外の資源は気にしなくていいんだ。」
> って思いました。もし、メモリ以外のリソースを使っているなら、
> メモリ枯渇で「GC」する前に、他のリソースが枯渇してしまうのだから、
> 「GC」に頼ることは出来ないはずですし。
> (明示的なDisposeを期待するオブジェクトは全てメモリ以外の
> リソースを使用している可能性があるのだと思っていました)
>
> それとも「GC」はメモリ以外のリソースについても管理し、「GC」が
> 走るのでしょうか?
>

システムリソースとかですかね?
けどよくよく考えると、いくらGCはしるといっても、ヒープ領域しかみてないなら、
GCはしんべやっていってほっといたら、GDIとかのシステムリソース先に食いつぶしそうですが。
引用返信 編集キー/
■20668 / inTopicNo.17)  Re[7]: g.Dispose();のコードについて
□投稿者/ 出水 (73回)-(2008/06/13(Fri) 16:10:52)
>設計上、CreateGraphics は、呼び出し元スレッドに所有権を設定し、他のスレッドで呼び出されると失敗します。
MSDNのCreateGraphicsを見るとこんなこと書いているけど、
実際には別のスレッドで同時に呼び合っても
問題なく取得できる…謎すぎる

昔はOSで1本だから、誰かが持ち逃げすると
リブートするしかなくなってましたよね?
昔の名残で今は気にしなくていいのかしら?
引用返信 編集キー/
■20669 / inTopicNo.18)  Re[8]: g.Dispose();のコードについて
□投稿者/ れい (655回)-(2008/06/13(Fri) 16:17:04)
No20668 (出水 さん) に返信
> 昔の名残で今は気にしなくていいのかしら?

昔のMSDNには書いてありませんねぇ。
引用返信 編集キー/
■20670 / inTopicNo.19)  Re[8]: g.Dispose();のコードについて
□投稿者/ επιστημη (1090回)-(2008/06/13(Fri) 16:17:31)
επιστημη さんの Web サイト
ちょちょちょちょい待ち。
No20662 の認識が真か偽か(偽ならばそれはドコで正しくはどぉか)
をまず答えてくれませんかのぅ > しってるひと

引用返信 編集キー/
■20671 / inTopicNo.20)  Re[8]: g.Dispose();のコードについて
 
□投稿者/ じゅで (50回)-(2008/06/13(Fri) 16:21:00)
No20668 (出水 さん) に返信
> >設計上、CreateGraphics は、呼び出し元スレッドに所有権を設定し、他のスレッドで呼び出されると失敗します。
> MSDNのCreateGraphicsを見るとこんなこと書いているけど、
> 実際には別のスレッドで同時に呼び合っても
> 問題なく取得できる…謎すぎる

確かに書いてありますね。
同時に呼んだらエラーになるって・・・
不思議だorz

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.creategraphics.aspx
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -