首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 陣列與對象內存分配時機:new 關鍵字觸發堆上分配

     編輯:程式設計綜合問答

代碼:

class Arr { public Arr() {} }

Arr[] a;
a = new Arr[1];   // 此處分配什麼?
a[0] = new Arr;   // 此處分配什麼?

詳細解析

語句分配內容位置說明
Arr[] a;棧上引用變量 (4/8 字節)Stack僅聲明引用,指向 null
a = new Arr[1];陣列對象 (包含 1 個 Arr 引用槽位)Managed Heap陣列本身是引用類型對象,初始化元素為 null
a[0] = new Arr;Arr 實例對象Managed Heap實際創建 Arr 對象,引用存入陣列槽位

內存圖解

Stack:  a  ──────┐
               │   (引用)
Heap:   Arr[]    ◄──┘  (長度1,類型 Arr[])
           [0] ──────┐
                     │ (引用)
           Arr 實例 ◄──┘  (調用 Arr() 構造函數)

關鍵點

  • new T[N] 分配陣列對象 (繼承 System.Array),元素預設為 null (引用類型) 或 0/false (值類型)。
  • new T() 分配單個對象實例。
  • 兩者均在託管堆上,由 GC 管理生命週期。
  • Arr[] a 與 a[0] 是完全獨立的兩個對象,類型分別為 Arr[] 和 Arr。

理解 new 觸發堆分配,陣列與元素對象分離,避免混淆引用與實例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved