ここから本文です

C#のガベージコレクションで質問です

ich********さん

2013/8/2117:17:47

C#のガベージコレクションで質問です

例えば、
void foo()
{
ClsBig bbb = new ClsBig();//ClsBigは巨大なクラス
// bbbをいろいろ操作・・・

bbb=null;//これを入れると入れないとで、ガベージコレクタの動作に差は?

}

上記のようなプログラムで、
ローカルでインスタンスを作成したクラスを、使い終わったときに
nullを埋め込むのと、何もしないのとでガベージコレクタの動作に差があったりするのでしょうか

例えば、nullで終了すると、早めにメモリから解放されるとか・・・

閲覧数:
214
回答数:
1

違反報告

ベストアンサーに選ばれた回答

2013/8/2200:19:45

.NETの実装を把握しきっているわけではないので確実なことではないですが、速くなるということはないと思います。
あってもなくてもローカル変数がfooメソッドのスコープを抜けた地点で参照がなくなり、GCの対象になることに変わりはありません。

もしかすると、bbb = null;の文は最適化によって削除される可能性があります。

そして、削除されなかった場合。逆に解放のタイミングが遅れる可能性さえ出てくると思われます。
void foo()
{
ClsBig bbb = new ClsBig();//ClsBigは巨大なクラス

//bbb操作
//bbbの操作終了
//bbbを使わないほかの処理

//bbb = null; 書く/書かない

}

となったばあい。
null代入を書いていないとGCはbbbの操作が終了し、[bbbを使わないほかの処理]中に「bbbはもう参照されることがない」と判断し、解放を行えます。(nullを代入していなくても自動で判断されるはずです。)
しかし、最後に代入文があると、「nullを代入する部分までbbbの参照は有効で、解放してはいけない」と処理され、[bbbを使わないほかの処理]中にもbbbはGCから免れます。

しても変わらない可能性が高いですが、代入をするならbbbの操作終了時にするぐらいでしょう。


と、GC.KeepAliveやHandleRefあたりの記述から私はそう認識しているのですが、それほど自信はないです。
http://msdn.microsoft.com/ja-jp/library/system.gc.keepalive.aspx

この回答は投票によってベストアンサーに選ばれました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる