核心概念
- 堆疊實例化:區域變數,離開作用域自動銷毀,記憶體由系統管理
- 堆上實例化:
new 配置,需手動 delete 釋放,否則記憶體洩漏
程式碼範例
#include
#include
using namespace std;
class Location {
public:
int x, y;
void printX() { cout << x << endl; }
void printY() { cout << y << endl; }
};
int main() {
// 堆疊實例化
Location loc1;
loc1.x = 10; loc1.y = 20;
loc1.printX(); loc1.printY(); // 自動銷毀
// 堆上實例化
Location* p = new Location();
if (!p) {
cout << "記憶體配置失敗" << endl;
return -1;
}
p->x = 100; p->y = 200;
p->printX(); p->printY();
delete p; // 必須釋放
p = nullptr; // 避免野指標
return 0;
}
關鍵差異總結
| 特性 | 堆疊 | 堆 |
| 配置速度 | 極快(指針移動) | 較慢(尋找空閒塊) |
| 大小限制 | 較小(~MB 級) | 大(受限於虛擬記憶體) |
| 生命週期 | 作用域綁定 | 手動控制 |
| 碎片問題 | 無 | 可能產生 |
| 適用場景 | 小型、短生命週期物件 | 大型、動態生命週期物件 |
最佳實踐
- 優先使用堆疊物件(RAII)
- 堆上配置搭配智慧指標(
unique_ptr/shared_ptr)自動管理
delete 後立即置 nullptr
- 避免在建構子中拋出異常導致資源洩漏