第五部份:記憶體模型(Stack、Heap 與 sizeof)
本文介紹C/C++的記憶體模型。
Stack vs Heap
在C/C++中,記憶體主要分為兩個區域:Stack(堆疊)和 Heap(堆積)。
- Stack:用於存儲局部變數和函數呼叫的相關資訊。Stack的大小通常較小,且由系統自動管理,當函數結束時,Stack上的資料會自動釋放。
- Heap:用於動態分配記憶體,大小通常較大,需要由程式員手動管理,使用
new和delete(C++)或malloc和free(C)來分配和釋放記憶體。
生命週期(Lifecycle)
- Stack上的變數在宣告的作用域內存在,當作用域結束時自動銷毀。
- Heap上的變數在被分配後存在,直到被手動釋放,否則會導致記憶體洩漏(Memory Leak)。
生命週期指的是變數從創建到銷毀的過程。Stack上的變數在函數呼叫期間存在,而Heap上的變數則需要手動管理其生命週期。
#include <iostream>
void stackExample() {
int x = 10; // x存在於Stack上
std::cout << "Stack variable: " << x << std::endl;
} // x在此處被銷毀
void heapExample() {
int* y = new int(20); // y存在於Heap上
std::cout << "Heap variable: " << *y << std::endl;
delete y; // 手動釋放y
} // y在此處被銷毀
int main() {
stackExample();
heapExample();
return 0;
}
Memory Leak
如果在Heap上分配的記憶體沒有被釋放,就會導致記憶體洩漏,這會消耗系統資源,最終可能導致程式崩潰。
void leak_example() {
int* y = new int(20);
// 忘記 delete y;
// 函數結束,但 Heap 上的記憶體沒有被釋放
// 如果這個函數被呼叫一百萬次,記憶體就會一直被佔用
}
這在嵌入式系統或長時間運行的服務中尤其嚴重,因為它們可能會持續運行很長時間,記憶體洩漏會逐漸累積,最終導致系統資源耗盡。
[閱讀全文]