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

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

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

Re[2]: Formを閉じる際に構造体の配列を解放


(過去ログ 138 を表示中)

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

■80942 / inTopicNo.1)  Formを閉じる際に構造体の配列を解放
  
□投稿者/ 青足 (5回)-(2016/08/22(Mon) 10:08:09)

分類:[C#] 

C#で自分で作った構造体の配列をFormを閉じる際に解放したいのですが、

public partial class Form1 : Form
{

struct ASDFG
{
public int intA;
public string strB;
public string strC;
};

ASDFG[] ZXC;変数名 = null;

private void Form1_Load(object sender, EventArgs e)
{
this.ZXC = new ASDFG[5];
}

private void フォーム閉じる
  {
Hide();
using (var form2 = new Form2())
{
this.ZXC = null; ← ここに解放処理を記述
form2.ShowDialog(this);
}
Show();

}

こんな感じで実装してみましたが、
解放処理は 変数名 = null; のみで問題ありませんか?


よろしくお願いします





引用返信 編集キー/
■80946 / inTopicNo.2)  Re[1]: Formを閉じる際に構造体の配列を解放
□投稿者/ ぶなっぷ (90回)-(2016/08/22(Mon) 10:45:42)
まず。。。
C#はガベージ・コレクタ機構を持っているので、
「自分で解放する必要は基本的にはない」
というのはよろしいかな?

それを承知の上で、何らかの理由(ループ中で生成/解放を繰り返していて、
ガベージコレクトのタイミングがないなど)があって、どうしても処理中に
明示的に解放する必要があるなら、以下を参照のこと。
http://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html

引用返信 編集キー/
■80948 / inTopicNo.3)  Re[1]: Formを閉じる際に構造体の配列を解放
□投稿者/ 魔界の仮面弁士 (835回)-(2016/08/22(Mon) 10:51:18)
No80942 (青足 さん) に返信
> private void フォーム閉じる
括弧が無いので、文法エラーになりますよね。
それに、記述してある内容はフォームを閉じる処理のものでは無いような…?


> C#で自分で作った構造体の配列をFormを閉じる際に解放したいのですが、
フォームが Dipose されると、そのインスタンスフィールドも自動解放されますよ。
――基本的には。


> 解放処理は 変数名 = null; のみで問題ありませんか?
配列の要素が int や string だけならそれで十分です。
(メンバーが Bitmap や FileStream や TextBox だったりすると微妙ですが)

ただし即時解放されるわけではなく、使用していたメモリーに対して
「解放しても OK」という回収対象マークが付与されるだけです。
実際に解放されるのは、ガベージコレクタ任せです。
引用返信 編集キー/
■80949 / inTopicNo.4)  Re[2]: Formを閉じる際に構造体の配列を解放
□投稿者/ ぶなっぷ (91回)-(2016/08/22(Mon) 10:52:40)
ちなみに、nullを代入しても、それは
「その変数が不必要になったよ」
と伝えるだけで、その場で解放されるわけじゃないのであしからず。
ガベージコレクタによって、回収されて初めて解放される。

C++とかの出身者かな?
デストラクタもそのタイミングで走るのであしからず。

コンストラクタでファイルをオープン、
デストラクタでそのファイルをクローズとかいうコードは、
C++では〇だけど、C#では×
いつファイルがクローズするか未定になってしまうから。

なので、そういうときのために using とかがある。
ま、話の内容からしてヒントさえ与えれば、自分で調査できそうに
思えるので、あとはネットサーフィンしてみてちょ。

引用返信 編集キー/
■80954 / inTopicNo.5)  Re[3]: Formを閉じる際に構造体の配列を解放
□投稿者/ なちゃ (134回)-(2016/08/22(Mon) 12:21:46)
まあ基本的にすでにある回答の通りですが、メンバにnullを代入しておくというのは、今回のような流れでは有効です。

有効というのは、その後のform2の表示中、元のフォームのインスタンスは生きたままなのですぐにGC対象にはならないため、明示的にメンバにnullを入れることで、そのメンバ(が参照していた配列)だけでも回収可能にしておくことが出来るからです。

もちろんその場で即座に回収されるのではなくて、後にGCが走ったときに回収出来るというだけです。
※でも、不要なものを回収可能にしておくことはそれなりに重要ではあります。
引用返信 編集キー/
■80955 / inTopicNo.6)  Re[1]: Formを閉じる際に構造体の配列を解放
□投稿者/ PANG2 (139回)-(2016/08/22(Mon) 12:43:07)
2016/08/22(Mon) 12:46:16 編集(投稿者)
No80942 (青足 さん) に返信
>      private void フォーム閉じる
>   {
>          Hide();
>          using (var form2 = new Form2())
>          {
>             this.ZXC = null;       ← ここに解放処理を記述
>             form2.ShowDialog(this);
>          }
>          Show();
> 
>       }

そもそもForm1を一時的に非表示にしてるだけで、閉じていない

引用返信 編集キー/
■81010 / inTopicNo.7)  Re[2]: Formを閉じる際に構造体の配列を解放
□投稿者/ Pepper (19回)-(2016/08/24(Wed) 22:02:32)
PANG2さん、ぶなっぷさん、魔界の仮面弁士さん、なちゃさん
ありがとうございました。

解決しました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -