C++ 標準變數與自訂物件預設存取無差異,但深入底層會發現兩大記憶體區域:
new/delete),靈活但風險高 (記憶體洩漏、重複釋放崩潰)class Human {
public:
void Talk() { cout << "Hello" << endl; }
~Human() { cout << "解構函數在工作..." << endl; }
private:
int age;
};
int main() {
Human h; // 堆疊物件
cout << "h大小:" << sizeof(h) << " 位址:" << &h << endl;
h.Talk();
Human *p = new Human(); // 堆物件
cout << "p大小:" << sizeof(p) << " 位址:" << p << endl;
p->Talk();
delete p; // 手動釋放,觸發解構
// p 位址值仍在,但指向記憶體已無效
// 建議 delete 後 p = nullptr 防止重複刪除崩潰
return 0;
}
輸出順序:先印 "p 解構" (手動 delete),最後印 "h 解構" (離開 main 自動銷毀)。註解 delete p 只會看到 h 的解構。
Human *p2 = p; // 兩指標指向同一位址
delete p; // 釋放記憶體
// delete p2; // 錯誤!重複釋放 → 崩潰
// p->Talk(); // 錯誤!使用已釋放記憶體 → 未定義行為
| C# 分類 | 包含型別 | 記憶體位置 | 對應 C++ 概念 |
|---|---|---|---|
| 值類型 | 基本型別 (除 string)、結構體、列舉 | 堆疊 | 區域變數、struct 實例 |
| 參考類型 | 類別、介面、委派、string、object | 堆 (資料) + 堆疊 (參考指標) | new Class()、指標/智慧指標 |
int 在 C# 實為 struct System.Int32,非 C++ 原生 intC# 的值/參考類型設計,本質上是將 C++ 手動管理的堆疊/堆語意語言化、規則化、自動化:
struct vs class 選擇 = 效能 vs 參考語意的架構決策理解 C++ 底層記憶體模型,能讓 C# 開發者更透徹掌握 boxing/unboxing、ref/out、stackalloc、Span<T> 等進階機制的本質。