2017-02-09 5 views
0

考えるIループを複数回関数fooの実行を解放するための変数を破壊します。私が関数Fooの外側で "b"を移動したくないと仮定した場合、後続の "b"初期化によって要求されるメモリを解放しなければならないのですか、それとも自動的に行われますか?C#のメモリ

+2

bがスタックに作成されます。あなたがそれを返すとすぐにそれは消えます。 –

+1

@MatthewWhited「b」は必ずしもスタック上に作成されません。 https://blogs.msdn.microsoft.com/ericlippert/2009/04/27/the-stack-is-an-implementation-detail-part-one/ –

+2

この種の変数を_manage_する必要があると思ったら[Value vs Reference Types](http://www.albahari.com/valuevsreftypes.aspx)を読み、[heap and stack]の違いを理解することをお勧めします(http://stackoverflow.com/questions/79923/what-スタックアンドヒープの場合) – Steve

答えて

3

これらは整数であり、スタックに格納できますが、この場合はそうではありません。変数が有効範​​囲外になるとすぐにスタックメモリを管理する必要はなく、スタックからポップされてメモリが解放されます。また、管理されたオブジェクトを(適切に)使用したときに.netで手動でメモリを管理することについてめったに心配する必要はありません。

これらの値が実際にスタックに格納されているかどうかについては、this answer by Marc Gravellを参照してください。また、その回答で指摘されているように、Eric Lippert a well written article(2009年以降はあまり変更されていません)。マルクGravellの答えから

彼らは時々ですが、ないよう:クラスの

  • フィールド反復子ブロックで
  • 捕獲変数
  • 変数を
+4

値の種類が必ずしもスタックに移動するとは限りません。その変数のデータが格納されている場所に格納されます。格納される場所は任意の数に限られ、そのうち1つだけがスタックに格納されます。 – Servy

+1

@Servy - 真実ですが、上記のやや単純な例では、そうなる可能性が高い場所です。 – Igor

+2

@Igorここでは、*ここにスタックしない*でしょう。しかし、それが真実であっても、答えはまだ間違っていて誤解を招きます。 – Servy