トップ回答者
関数内で確保したオブジェクトの生存期間について

質問
-
初歩的な質問ですいません。
関数内で確保したオブジェクトを戻り値として戻した場合、そのオブジェクトの生存はどの時点まで保証されるのでしょうか?
例えば以下のように関数内で配列を確保し、それを戻り値として戻したとします。
class hoge { public byte[] ToByte() { byte[] ret = new byte[10]; //処理// return ret; } }
この関数を利用して次の処理を記述したとします。
class fuga { public void Question() { hoge h = new hoge(); byte[] data = h.ToByte(); //dataを使用した処理// return; } }
この場合、ToByte()関数内で確保したオブジェクトは、C言語での自動変数的な振る舞いをすると解釈した場合、関数から抜けた段階で保証されなくなってしまいますが、
一方で参照をreturnしていますので、依然としてそのオブジェクトは参照されているとしてガーベジコレクションの対象とはならないようにも思えます。
このような処理の場合、関数内で確保したオブジェクトの生存はどこまで保証されるのでしょうか?
回答
-
> 関数内で確保したオブジェクトの生存はどこまで保証されるのでしょうか?
最後に参照しているところまでです。参照が失われた時点で保障されない状態になります。ただし、ソースコード的に到達可能(スコープ内)であることと参照が有効であることは別ですので、C言語の auto 変数のように、関数が抜けるまで有効ではありません。
{ // 参照を開始 var data = h.ToByte(); // data を使用してるので、ここは保証されている Console.WriteLine(data.ToString()); // こちらの行の時点では、もう data を参照していないので // この時点で data はもう保障されていない Console.WriteLine("end."); }
- 回答としてマーク ゆにまとりっくす 2011年4月21日 8:14
すべての返信
-
> 関数内で確保したオブジェクトの生存はどこまで保証されるのでしょうか?
最後に参照しているところまでです。参照が失われた時点で保障されない状態になります。ただし、ソースコード的に到達可能(スコープ内)であることと参照が有効であることは別ですので、C言語の auto 変数のように、関数が抜けるまで有効ではありません。
{ // 参照を開始 var data = h.ToByte(); // data を使用してるので、ここは保証されている Console.WriteLine(data.ToString()); // こちらの行の時点では、もう data を参照していないので // この時点で data はもう保障されていない Console.WriteLine("end."); }
- 回答としてマーク ゆにまとりっくす 2011年4月21日 8:14