在下面的代碼中,一旦它在第二行被重新分配,myArray最初指向的內存會發生什麼變化?該內存是否丟失,或者C#垃圾回收器是否處理了它?在C#中重新分配數組時,內存會發生什麼變化?
static void Main(string[] args)
{
double[] myArray = new Double[10];
myArray = new Double[3];
}
至於我一直在讀,沒有辦法,明確釋放內存,所以我希望C#自動執行它。
在下面的代碼中,一旦它在第二行被重新分配,myArray最初指向的內存會發生什麼變化?該內存是否丟失,或者C#垃圾回收器是否處理了它?在C#中重新分配數組時,內存會發生什麼變化?
static void Main(string[] args)
{
double[] myArray = new Double[10];
myArray = new Double[3];
}
至於我一直在讀,沒有辦法,明確釋放內存,所以我希望C#自動執行它。
當您的變量超出範圍並且內存不再需要時,它就有資格進行垃圾回收。
MS解釋了所有,如下所示:https://msdn.microsoft.com/en-us/library/aa691138(v=vs.71).aspx
C#採用自動內存管理,這從手動分配和釋放由物體佔用的存儲器釋放顯影劑。
自動內存管理策略由垃圾收集器實現。一個對象的內存管理的生命週期是 如下:
- 在創建對象時,內存分配給它的構造函數運行,並且對象被認爲是活的。
- 如果對象或其任何部分無法通過任何可能的繼續執行來訪問,除了運行破壞程序之外,該對象被認爲不再使用,並且它變爲 有資格銷燬。 C#編譯器和垃圾收集器 可以選擇分析代碼以確定將來可以使用對象的哪些引用。例如,如果局部變量是範圍內的 是對對象唯一的現有引用,但是該過程中當前執行點執行的任何可能的 執行中從未引用該變量本地 ,則垃圾收集器 可能(但並非必須)將該對象視爲不使用更長的對象。
- 一旦對象有資格銷燬,在稍後的某個未指定的時間運行 對象的析構函數(第10.12節)(如果有)。除非被顯式調用覆蓋,否則該對象只能運行一次。
- 一旦運行了對象的析構函數,如果該對象或其任何部分不能被任何可能的延續執行(包括運行析構函數)訪問,則該對象被認爲是不可訪問的,並且該對象變爲符合條件爲 集合。
- 最後,在對象符合收集條件之後的某段時間,垃圾收集器將釋放與該對象關聯的內存。
如果你想進入更詳細,那麼你可以看看這裏:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/index
或我敢肯定,你也可以找到關於該主題一些博客。
當然,在分配之前,C#會自動釋放與myArray
關聯的內存。這不會立即發生,但只要垃圾收集器意識到沒有剩餘的對該Double[10]
數組對象*的引用,分配給該對象的內存就會被回收。
如果你改變你的程序稍微創建第二個引用同一個數組,這樣
double[] myArray = new Double[10];
double[] myArray2 = myArray; // Second reference
myArray = new Double[3];
垃圾收集器將不釋放對象,只要一提到它仍然可以訪問您的程序。
*有時您的程序會在垃圾回收器完成分析之前完成執行。儘管如此,內存仍然得到釋放。
_垃圾收集器意識到沒有剩餘的引用_。 - 取決於應用程序的大小/使用這可以在應用程序關閉後發生變化 – Fabio
@Fabio這很公平。我添加了一個腳註提到這一點。謝謝! – dasblinkenlight
_garbage collector會照顧它__ – Fabio
數據仍然保留在內存中一段時間。由於您再也沒有任何指向該數據的指針,GC將在必要時收集該空間。 – 0xaryan