DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メモリの開放について

環境/言語:[VB.NET]
分類:[.NET]

いつも楽しく拝見させていただいております。
本サイトTIPS中の「別のフォームのデータを取得、設定する」を拝見させていただきましたおかげで、フォーム間でのデータ交換は「プロパティ」を使用するのが有効であると理解しました。

TIPS中のサンプルプログラムについて、以下の追加を行ってみました。
(Form2をダイアログ表示したあとに、disposeを追加)

【TIPSのサンプルソースより】
>TextBox1.TextにアクセスするForm1のコードは次のようになります。
>
>[VB.NET]
>Public Class Form1
> Inherits System.Windows.Forms.Form
>
> Private Sub Button1_Click(ByVal sender As System.Object, _
> ByVal e As System.EventArgs) Handles Button1.Click
> 'Form2オブジェクトの作成
> Dim f2 As New Form2
>
> 'Form2のTextBox1の内容を変更する
> f2.TextBoxValue = ""
>
> 'Form2をモーダルで表示
> f2.ShowDialog(Me)
* f2.dispose() ←追加
>
> 'Form2のTextBox1の内容を取得する
> Dim s As String = f2.TextBoxValue
>
> '結果を表示する
> MessageBox.Show(s)
> End Sub
>
> (以下省略)
>End Class


ここで「f2.TextBoxValue」はf2のプロパティなのですが、直前にdisposeにてメモリ開放したはずなのに、エラーとなりませんでした。(正常な値を取得)
disposeを用いても、メモリは開放されないのでしょうか?
こんにちは中です。

Disposeはメモリから開放する命令ではありません。
Disposeはあくまでマネージドでないリソースなどを開放するためで、実際の開放処理はGCにゆだねられています。

ただし、Dispose後にアクセスできる=使っていい ではないので、やめましょう。

IDisposable.Dispose
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemIDisposableClassDisposeTopic.asp

------------------------------------------------------
中博俊 MSMVP Visual Studio C# Since 2004/04-2005/03, MCP
http://naka.wankuma.com/
http://naka.wankuma.com/blog/
naka@wankuma.com
中さま :

ご回答ありがとうございます。
dispose後もアクセス可能な件、納得いたしました。

> Disposeはメモリから開放する命令ではありません。
> Disposeはあくまでマネージドでないリソースなどを開放するためで、実際の開放処理はGCにゆだねられています。

なるほど、リソース=メモリではないわけですね。
ただ、「マネージドでないリソース」とは、具体的にどのようなものなのでしょうか?(デバイス関係?通信ポート?)
> ただ、「マネージドでないリソース」とは、具体的にどのようなものなのでしょ
>うか?(デバイス関係?通信ポート?)

ファイルアクセス、ウィンドウ、フォントなどなど、メモリ以外のほとんどのブツです。
Windows OS では、概ね「ハンドル」で表現されます。
2005/01/30(Sun) 13:53:31 編集(投稿者)
2005/01/30(Sun) 13:52:57 編集(投稿者)

渋木さま :
ご回答ありがとうございます。

>>ただ、「マネージドでないリソース」とは、具体的にどのようなものなのでしょ
> >うか?(デバイス関係?通信ポート?)
>
> ファイルアクセス、ウィンドウ、フォントなどなど、メモリ以外のほとんどのブツです。
> Windows OS では、概ね「ハンドル」で表現されます。

なるほど。了解しました。
では、そのウィンドウが使用していた通信ポート(ソケット/シリアルポート)も同様に開放されるのでしょうか?
よく、「ウィンドウを閉じたあと、同じポートにアクセスしようとするとエラーになる」という話をよく聞きますが・・・。
通信ポート≠リソース なのでしょうか?

あと、このへん(FrameWorkにおけるメモリ管理/GCなど)についてのサイト/書籍などがあればご紹介いただければと存じます。
> では、そのウィンドウが使用していた通信ポート(ソケット/シリアルポート)も同様に開放されるのでしょうか?

何が、どのタイミングで?
省略が多くて、何を尋ねたいのかよく分からないです。

一般論で言えば、ウィンドウと通信ポートの間には、本質的には何の関連もありません。
ウィンドウが閉じた時に通信ポートの解放が必要なら、そのようにプログムを書くのです。

> よく、「ウィンドウを閉じたあと、同じポートにアクセスしようとするとエラーになる」という話をよく聞きますが・・・。

私は聞いたこと無いです。
単なるコーディングミスないですか?

> 通信ポート≠リソース なのでしょうか?

「リソース」という語を辞書で調べてみましょう。
リソース=資源です。

広い意味では、メモリも含めて、アプリケーションが動作するのに必要な資源すべてがリソースです。
.NET の場合、ほとんどのメモリ管理は自動化されているので、それ以外の、特に OS 由来の資源については、ユーザコードで明示的に管理しなくてはなりません。

> あと、このへん(FrameWorkにおけるメモリ管理/GCなど)についてのサイト/書籍などがあればご紹介いただければと存じます。

・MSDN Library
・Essential .NET

なんてあたりでしょうか。
渋木さま :


>>では、そのウィンドウが使用していた通信ポート(ソケット/シリアルポート)も同様に開放されるのでしょうか?
>
> 何が、どのタイミングで?
> 省略が多くて、何を尋ねたいのかよく分からないです。
>
> 一般論で言えば、ウィンドウと通信ポートの間には、本質的には何の関連もありません。
> ウィンドウが閉じた時に通信ポートの解放が必要なら、そのようにプログムを書くのです。
>
>>よく、「ウィンドウを閉じたあと、同じポートにアクセスしようとするとエラーになる」という話をよく聞きますが・・・。
>
> 私は聞いたこと無いです。
> 単なるコーディングミスないですか?
>
説明不足で申し訳ありません。
以下の掲示板などを見て、上記のような認識を持っておりました。
【ORiN協議会の掲示板】通信エラーについて
http://www.orin.jp/cgi-bin/cbbs.cgi?mode=one&namber=5&type=0&space=0&no=5
この場合は、通信ポートNを使用するオブジェクトを2重に作成していたため、ポートが開けなかったようでした。
話がごっちゃになっておりました。申し訳ありません。

>>(FrameWorkにおけるメモリ管理/GCなど)についてのサイト/書籍などがあればご紹介いただければと存じます。
>
> ・MSDN Library
> ・Essential .NET
>
> なんてあたりでしょうか。
>
しっかり参照させていただきます。

リソースについて、いままで目をそむけていました。
皆様のおかげで、少し見えてきたようなきがします。
ご丁寧なご回答、どうもありがとうございました。
【解決!】
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板