2017-07-27 96 views
1

在下面的代碼中,一旦它在第二行被重新分配,myArray最初指向的內存會發生什麼變化?該內存是否丟失,或者C#垃圾回收器是否處理了它?在C#中重新分配數組時,內存會發生什麼變化?

static void Main(string[] args) 
{ 
    double[] myArray = new Double[10]; 
    myArray = new Double[3]; 
} 

至於我一直在讀,沒有辦法,明確釋放內存,所以我希望C#自動執行它。

+5

_garbage collector會照顧它__ – Fabio

+0

數據仍然保留在內存中一段時間​​。由於您再也沒有任何指向該數據的指針,GC將在必要時收集該空間。 – 0xaryan

回答

2

當您的變量超出範圍並且內存不再需要時,它就有資格進行垃圾回收。

MS解釋了所有,如下所示:https://msdn.microsoft.com/en-us/library/aa691138(v=vs.71).aspx

C#採用自動內存管理,這從手動分配和釋放由物體佔用的存儲器釋放顯影劑。

自動內存管理策略由垃圾收集器實現。一個對象的內存管理的生命週期是 如下:

  1. 在創建對象時,內存分配給它的構造函數運行,並且對象被認爲是活的。
  2. 如果對象或其任何部分無法通過任何可能的繼續執行來訪問,除了運行破壞程序之外,該對象被認爲不再使用,並且它變爲 有資格銷燬。 C#編譯器和垃圾收集器 可以選擇分析代碼以確定將來可以使用對象的哪些引用。例如,如果局部變量是範圍內的 是對對象唯一的現有引用,但是該過程中當前執行點執行的任何可能的 執行中從未引用該變量本地 ,則垃圾收集器 可能(但並非必須)將該對象視爲不使用更長的對象。
  3. 一旦對象有資格銷燬,在稍後的某個未指定的時間運行 對象的析構函數(第10.12節)(如果有)。除非被顯式調用覆蓋,否則該對象只能運行一次。
  4. 一旦運行了對象的析構函數,如果該對象或其任何部分不能被任何可能的延續執行(包括運行析構函數)訪問,則該對象被認爲是不可訪問的,並且該對象變爲符合條件爲 集合。
  5. 最後,在對象符合收集條件之後的某段時間,垃圾收集器將釋放與該對象關聯的內存。

如果你想進入更詳細,那麼你可以看看這裏:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/index

或我敢肯定,你也可以找到關於該主題一些博客。

3

當然,在分配之前,C#會自動釋放與myArray關聯的內存。這不會立即發生,但只要垃圾收集器意識到沒有剩餘的對該Double[10]數組對象*的引用,分配給該對象的內存就會被回收。

如果你改變你的程序稍微創建第二個引用同一個數組,這樣

double[] myArray = new Double[10]; 
double[] myArray2 = myArray; // Second reference 
myArray = new Double[3]; 

垃圾收集器將釋放對象,只要一提到它仍然可以訪問您的程序。

*有時您的程序會在垃圾回收器完成分析之前完成執行。儘管如此,內存仍然得到釋放。

+0

_垃圾收集器意識到沒有剩餘的引用_。 - 取決於應用程序的大小/使用這可以在應用程序關閉後發生變化 – Fabio

+0

@Fabio這很公平。我添加了一個腳註提到這一點。謝謝! – dasblinkenlight

相關問題