2016-03-19 15 views
0

.NETのメモリ管理に疑問があります。私の理解によれば、メモリは以下のように割り当てられ、取り戻されます。クラスインスタンスのメモリ管理

  1. フレームワークはスタックにメモリを割り当てます。

  2. すべての参照型では、メモリはヒープ内に割り当てられます( )。このメモリは後でGCによってフラッシュまたは管理されます。

  3. スタックに割り当てられたメモリの場合、実行が完了すると、 LIFOメソッドでメモリがクリアされます。

    Class MathLibrary{ 
    
    int number1; 
    int number2; 
    
    public int computesum(){ 
        return number1 + number2; 
    } 
    

    }

    MathLibrary maths = new MathLibrary(); // Class instance 
    

    メモリの割り当ては、ここで起こるどのように、私はこのオブジェクトのためにその参照(数学)を理解している:私の疑問は、以下のシナリオにある

スタックに格納され、実際のメモリはヒープに割り当てられます。その場合、値の型(2つの整数変数)とメソッド定義に割り当てられるメモリはどこになりますか?

+0

私の答えはあなたの質問に答えましたか?もしそうなら、[this](http://stackoverflow.com/help/someone-answers) – CodingYoshi

答えて

3

すべての値型で、フレームワークはスタックにメモリを割り当てます。

これは必ずしも真実ではありません。値の型がメソッド内で宣言されている場合は、スタックに格納されます。クラスレベルの変数の場合は、それを所有するオブジェクトがヒープ上に割り当てられているため、ヒープ上に配置されます。

MathLibraryの場合、2つの整数はそのオブジェクトのフィールドであるため、ヒープ上にもあります。

すべての参照型では、メモリはヒープ内に割り当てられます。ヒープは後でフラッシュされ、GCによって管理されます。

はい、これは該当します。ただし、ここで覚えておくべき重要なことは、オブジェクトがヒープ上に割り当てられることですが、このオブジェクトがメソッド内で作成された場合、オブジェクトの参照はスタック上に存在することになります。実際のオブジェクトはヒープ上にあります。例えば:

public void Foo() 
{ 
    Foo f = new Foo(); 
} 

参照「F」がスタックになりますが、参照が参照している実際のオブジェクトはヒープ上にあろう。

1

値の型についてのあなたの理解は間違っています!一般に、次の2つの黄金ルールがあります。

  1. 参照型はヒープに割り当てられます。
  2. 値の型とポインタ(他のオブジェクトへの参照)は、宣言されている場所に割り当てられます。

はほかに、StackHeapに関するこれら二つの事実があります。

  1. Stackは(...、パラメータを渡し、メソッド呼び出し)我々のコードで実行しているものを追跡するための責任があります。
  2. Heapは、オブジェクトの追跡を担当します。これの両方はれるようクラスのインスタンスであるオブジェクトは、Heap上に配置されるようにだからあなたの例では、両方の値の種類(数値1と数値2)を参照型であるクラス内で宣言されている

値の型! mathsオブジェクトは実際には実際のオブジェクトへの参照なので、宣言された場所に完全に依存します! たとえば、メソッドで宣言されている場合は、Stackが呼び出されたトラックを保持するため、maths参照はスタックに存在し、Heapの実際のオブジェクトを指します。しかし、インスタンスメンバーとして宣言されている場合は、Heapに存在します。

+1

を読んでください。そして、独自のセマンティクスを持つキャプチャ変数があります。 –