許多 C++ 初學者會疑惑:在類別的成員函式中以值語意實例化物件(未使用 new),這些物件的記憶體何時釋放?是否需要手動管理?本文深入解析堆疊物件的生命週期與 RAII 原則。
當在函式內部以 ClassName obj; 或 ClassName obj(args); 宣告物件時,該物件分配在堆疊上。其生命週期嚴格遵循作用域規則:
class Resource {
public:
Resource() { std::cout << "建構\\n"; }
~Resource() { std::cout << "解構\\n"; }
};
void MemberFunc() {
Resource res; // 堆疊物件
// ... 使用 res
} // 函式結束,res 自動解構,記憶體釋放
delete?delete 僅適用於以 new 配置在堆積上的動態記憶體。堆疊物件由編譯器自動插入解構函式呼叫於作用域結束處,屬於語言層面的保證(RAII:Resource Acquisition Is Initialization)。
Resource res(); // 錯誤!這是函式宣告,非物件實例化
Resource res; // 正確:預設建構
Resource res{}; // C++11 統一初始化
若物件佔用大量記憶體(如大型陣列、緩衝區),堆疊可能不足。此時應改用智慧指標(std::unique_ptr、std::vector)管理堆積記憶體。
C++17 起保證複製省略(RVO/NRVO),以值回傳區域物件不會產生額外複製成本,且安全無虞。
| 配置方式 | 記憶體區域 | 釋放時機 | 需手動管理? |
|---|---|---|---|
Type obj; | Stack | 離開作用域 | 否 |
new Type() | Heap | 呼叫 delete | 是(建議用智慧指標) |
掌握堆疊物件自動釋放機制,是撰寫安全、高效 C++ 程式的基石。善用 RAII,讓編譯器替你處理資源管理。