很多從 C#/Java 轉 C++ 的開發者會疑惑:ifstream file; file.open(...); file.close(); 這樣用明明沒 new,為什麼不用 delete 也沒事?
ifstream file; 是定義一個對象,編譯器在棧上分配內存,並自動調用默認構造函數初始化。// 棧上(自動管理)
ifstream file;
file.open("test.txt");
// ... 用完自動關閉、釋放
// 堆上(手動管理)
ifstream* pFile = new ifstream();
pFile->open("test.txt");
// ... 必須手動
delete pFile; // 否則內存洩漏、資源洩漏
在構造函數/析構函數設置斷點,觀察調用棧:
new 指令參與。std::vector, std::string, std::unique_ptr 等,棧上定義即自動管理堆內存。理解「棧上對象自動析構」是掌握 C++ 資源管理的鑰匙,告別手動 new/delete 的痛苦,擁抱 RAII 的優雅與安全。